为什么将int(0)分配给字符串索引会结束循环?

时间:2018-09-21 19:49:08

标签: c for-loop break

这是我遇到的难题。

编译时没有错误:

$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; 
        }
    }

2 个答案:

答案 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++) {
  // ...
}