【发布时间】:2019-09-04 07:12:50
【问题描述】:
我有一个 for 循环,它应该运行 4 次,但运行了 6 次。 你能解释一下这种行为吗? 这很奇怪,因为 stringarr1 没有改变。
编辑:我想删除所有“!”来自我的第一个字符串,并希望将这些字母保存在第二个字符串中。
#include <stdio.h>
#include <math.h>
#include <string.h>
int main(){
char stringarr1[] = "a!bc";
char stringarr2[] = "";
printf("%d\n", strlen(stringarr1)); // lenght --> 4
for (size_t i = 0; i < strlen(stringarr1); i++)
{
printf("i: %d\n", i);
if (stringarr1[i] != '!') {
stringarr2[strlen(stringarr2)] = stringarr1[i];
printf("info: != '!'\n");
}
}
}
【问题讨论】:
-
char stringarr2[] = "";这会生成一个大小为 1 的数组,stringarr2[0]是空终止符。您不能以这种方式进行字符串操作。给它一个合适的大小。 -
你的结论是什么?
-
在我看其他东西之前,不要在 for 循环的条件中使用 strlen。它计算每次循环迭代的字符串长度。在循环之前将长度存储在变量中。
-
@ChrisRollins 字符被复制到字符串末尾时没有间隙。无论这可能在哪里......
-
附带说明,使用
printf()和%d(需要int)打印strlen()的返回值,它的类型为size_t(需要int)会导致未定义的行为。使用%zu。