【发布时间】:2019-06-08 18:49:20
【问题描述】:
我正在编写一个程序来将 C 中的字符串中的子字符串大写。
这里有一些例子来说明我的预期输出:
String: "hello world"
Substring: "wo"
Output: "hello WOrld"
String: "I don't know how to do this"
Substring: "do"
Output: "I DOn't know how to DO this"
String: "mouse is useful thing"
Substring: "use"
Output: "moUSE is USEful thing"
String: "replace occurrences of 'r'"
Substring: "r"
Output: "Replace occuRRences of 'R'"
基本上,子字符串存在于字符串中的任何地方,在原始字符串中都大写。
这是我的代码:
void replaceSubstring(char *str, char *substr) {
char *p = str;
char *k = substr;
int substringLength = strlen(k);
while (*p)
{
if (strncmp(p, k, substringLength) == 0)
{
for (p; p < p + substringLength; p++)
{
*p = *p - 32;
}
}
p++;
}
puts(p);
printf("\n");
}
但是,我的代码崩溃了。我的方法是在字符不是'\0' 时循环并检查子字符串是否位于字符串中的某个位置(使用strncmp 函数),如果是,我想将值*p 更改为通过将其 ASCII 值减少 32 来获得一个大写字母。
为什么它不起作用?哪里错了?
【问题讨论】:
-
请参阅
toupper库函数,并注意尝试修改字符串文字(您不显示输入)。 -
使用
strstr()查找字符串。使用toupper()从<ctype.h>进行大小写转换。 -
怎么不工作了?
-
for (p; p < p + substringLength; p++)现在你能描述一下p < p + substringLength会随着p变化而从true变为false的情况吗?另一方面,不要使用幻数; 32 无论如何都有意义,请使用islower和toupper之类的函数。 -
您在外部和内部嵌套循环中使用
p作为控制变量。使用不同的变量。
标签: c arrays string pointers substring