这是我遇到的难题。
编译时没有错误:
$gcc -Wall -Wextra -pedantic -std=c99
您能解释一下为什么在C语言中会发生这种情况吗?
预期:
在str [i]打印出索引和char并替换
输出:
如果我尝试将str [i]重新分配为0,则它会中断for循环。
char str[] = "this is only a test";
for(int i = 0; i < (int)strlen(str); i++) {
printf("str[%d] = %c\n", i, str[i]);
if(str[i] == ' ') {
str[i] = 0;
}
}
答案 0 :(得分:3)
您的程序运行正常(假设您已经包含了string.h
)-当找到空格' '
作为字符时,它会设置 ith 索引到\0
,并在下一次strlen
计算长度时,发现违反了i<(int)strlen
(发现在较早位置处终止),并且循环终止了。
这是 GCC 上的输出,没有任何警告/错误:
str[0] = t
str[1] = h
str[2] = i
str[3] = s
str[4] =
唯一的是,它将不会打印整个字符串,因为当您发现要替换的空格字符时,它将终止为空,下次strlen
条件被违反并且退出循环时。
要打印整个字符串,最好使用一个变量,并以字符串的长度对其进行初始化,然后将该变量用作条件:
unsigned length = strlen(str);
for(int i = 0; i < length; i++)
另外,您无需将strlen
的返回值强制转换为int
。
答案 1 :(得分:1)
由于要操纵字符串并反复调用strlen
,所以在这里遇到麻烦。请记住,for
终止条件是在整个循环中的每次次评估,而不是一次。
要解决此问题:
size_t l = strlen(str); // Save the length once
for (int i = 0; i < l; i++) {
// ...
}