【发布时间】:2017-12-29 11:45:48
【问题描述】:
我在这段代码中使用了一个数组,因为我需要一个应该始终修改的字符串,这就是我不使用指针的原因,但是每次我运行代码时,我都会在第 31 次迭代时得到一个奇怪的行为。
代码
int i = 0;
char name[100];
srand(getpid());
while(i<100) {
name[i] += (char)'A'+(rand()%26);
printf("%d strlen\n", i+1);
printf("%s\n", name);
printf("/////\n");
i++;
}
输出
/////
30 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOY
/////
31 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOYJ
/////
32 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOYJWttime
/////
33 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOYJW�time
/////
34 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOYJW��ime
/////
35 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOYJW���me
/////
36 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOYJW����e
/////
37 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOYJW�����
换句话说,它总是将ttime 打印为第 31 个字符,然后代码会覆盖该单词的每个字符,结果我得到问号。
事情会变得更糟,看看最终的输出
100 strlen
IKXVKZOLKHLTKBFFTUZCYXHYVEBZOYJW�����K��ȶ������MKRLHALEV�SNNRVWNOEXUVQNJUHAEWN�W�YPMCW�N�PXHNT��0�
/////
为什么会这样?
【问题讨论】:
-
name不是0-在游戏开始前被输出,然后被视为 C 字符串:臭名昭著的未定义行为再次发生。 -
我打赌你之前有其他语言的经验。 C 字符串很奇怪——但可以预测。
string += 'x'不会像你想的那样做。 -
@alk 比赛开始前不是0-out是什么意思?
-
@usr2564301 你是对的,这种方式效果更好,但仍然会打印一些未定义的字符
-
因为它并没有像你想象的那样做......在你最喜欢的 C 手册中查找“字符串”。
标签: c arrays string c-strings srand