我有以下程序,我想以我的名义(Sahand)逐个字符地阅读并以字符串形式存储:
#include <stdio.h>
int main(int argc, const char * argv[]) {
char temp;
char str[6];
int i;
for ( i = 0 ; i < 6 ; i++ )
{
scanf(" %c",&temp);
printf("Our temp is: %c\n",temp);
str[i] = temp;
printf("Our total string is: %s\n",str);
}
printf("Program ended with the string: %s\n",str);
return 0;
}
输出是这样的:
s
Our temp is: s
Our total string is: s
a
Our temp is: a
Our total string is: sa
h
Our temp is: h
Our total string is: sah
a
Our temp is: a
Our total string is: saha
n
Our temp is: n
Our total string is: sahan
d
Our temp is: d
Our total string is: sahandd\350\367\277_\377
Program ended with the string: sahandd\350\367\277_\377
Program ended with exit code: 0
正如你所看到的,一切都很顺利,直到最后一个字母d进入,当另一个d和一堆随机的东西被添加到字符串上时。有人可以向我解释这里发生了什么吗?
答案 0 :(得分:6)
您应该在打印前将空字符添加到字符串中。由于您在循环内打印,请将其添加到下一个字符。绝对要确保for循环不会超出数组的范围。
#include <stdio.h>
int main(int argc, const char * argv[]) {
char temp;
char str[7];
int i;
for ( i = 0 ; i < 6 ; i++ )
{
scanf(" %c",&temp);
printf("Our temp is: %c\n",temp);
str[i] = temp;
str[i+1] = '\0';
printf("Our total string is: %s\n",str);
}
printf("Program ended with the string: %s\n",str);
return 0;
}
另一种选择是将C-String中的每个字符实际初始化为&#39; \ 0&#39;角色(没有覆盖最后一个);正如其他人在评论中提到的那样,这可以在数组的声明中完成:
char str[7] = { 0 };
答案 1 :(得分:0)
您需要空字符('\0'
)来结束5th
索引处的字符串(数组),以告诉编译器这是字符串的结尾(在您的情况下是字符数组,即, str
)。但是您使用5th
索引来存储字符'd'
。
编译器从garbage value
memory
为了正确运行程序,您需要声明str
数组,如下所示:
char str[7];
在'\0'
位置插入空字符((i+1)th
)。看下面:
#include <stdio.h>
int main(int argc, const char * argv[]) {
char temp;
char str[7];
int i;
for ( i = 0 ; i < 6 ; i++ )
{
scanf(" %c",&temp);
printf("Our temp is: %c\n",temp);
str[i] = temp;
str[i+1] = '\0';
printf("Our total string is: %s\n",str);
}
printf("Program ended with the string: %s\n",str);
return 0;
}
答案 2 :(得分:-2)
阅读完评论后,我在程序中更改了以下行:
char str[6];
到
char str[7];
这就是诀窍,程序按照我的意愿执行。
编辑:
除了更改此行之外,我在变量声明后添加了str[6] = 0;
。