【发布时间】:2016-12-01 13:15:29
【问题描述】:
我写了一个程序来反转一个字符串。但是,当我只输入“回车”键时,它会打印出一个“@”。
代码如下:
#include <stdio.h>
#include <string.h>
int main(void)
{
int i, j, temp;
char str[80];
scanf("%[^\n]s", str);
i = strlen(str);
//printf("%d\n", i);
//printf("%d\n", sizeof(str));
for (j=0; j<i/2; j++) {
temp=str[i-j-1];
str[i-j-1]=str[j];
str[j]=temp;
}
for(i = 0; str[i] != 0; i++)
putchar(str[i]);
}
我尝试使用printf() 函数来查看当我按下“Enter”键时会发生什么。
但是,添加printf("%d\n", i);后,输出变成了“3@”。
添加printf("%d\n", sizeof(str));后,输出变为“0 80”。
似乎“sizeof”已经自动“修复”了问题。
我室友说问题可能是初始化造成的。我尝试将代码char str[80] 更改为char str[80] = {0},一切正常。但是我仍然不明白“sizeof”存在于代码中时的作用。如果真的导致初始化,程序一行行运行为什么会出现这种情况?
【问题讨论】:
-
在分配变量之前取消引用(使用)变量的值会导致未定义的行为 (UB),这意味着任何事情都可能发生。
-
具体来说,内存被初始化为0,所以内存位置已经存在的东西仍然存在。通过设置
char str[80] = {0},您是说在数组中创建第一个值0,然后用null(即0)填充数组的其余部分。 -
感谢您的 cmets。但是,我仍然不明白为什么我使用了“sizeof”后问题就解决了。
-
你混淆了数组长度和字符串长度。 Sizeof 返回元素的字节大小(这里 str 是一个 80 个字符的数组,一个 char 是 1 个字节大小)。但是如果在你的str中你写“toto”,字符串长度是4。但是sizeof(str)仍然是80
-
@Fefux 谢谢你的帮助,但我怕我表达得不好。在此程序中,如果未输入任何内容,则字符串长度应为 0。然而,在我使用“sizeof”之前,由于未定义的行为,“strlen”返回了“3”。但是,我在下一行添加“sizeof”后,“strlen”为什么返回正确的数字“0”?
标签: c