关于字符串的一个小问题
#include<stdio.h>#include<string.h>
int main()
{
int i=-1;
char str;
do
{
i++;
scanf("%c",&str);
}while(str!='#');
puts(str);
return 0;
} 当你输入 8/(5+2)-6#这个字符串的时候,输出末尾会有一个@的符号,这是为什么呀
会不会是你一不小心多按了个# char str={'\0'}; //初始化 字符串尾部缺少结束标志 '\0'
} while(str != '#') ;
str= '\0' ; // 增加这条代码
puts(str) ; jackz007 发表于 2019-3-24 21:47
字符串尾部缺少结束标志 '\0'
嗯 这样是可以啦。谢谢{:10_254:}
但是我还想知道为什么没有结束标志它还是结束了,而且以@这个符号结束 大魔王S 发表于 2019-3-25 16:33
嗯 这样是可以啦。谢谢
但是我还想知道为什么没有结束标志它还是结束了,而且以@这个符号结束
因为‘@’本来就在那个位置啊,
写了个函数ShowStrData(),自己运行一下,看看string里的数据是如何变化的
#include<stdio.h>
void ShowStrData(char* sz,int size){
int i;
printf("\n");
for (i=0;i<size;++i){
printf(" %02X",sz);
}
printf("\n");
for (i=0;i<size;++i){
if (sz<=31 || sz>=127) printf(" __");
else printf("%c",sz);
}
printf("\n");
}
int main()
{
int i=-1;
char str;
ShowStrData(str,20);
do
{
i++;
scanf("%c",&str);
}while(str!='#');
ShowStrData(str,20);
puts(str);
return 0;
} Croper 发表于 2019-3-25 17:07
因为‘@’本来就在那个位置啊,
写了个函数ShowStrData(),自己运行一下,看看string里的数据是如何变 ...
嗯嗯,感谢{:10_275:}
我运行过啦,所以说 :string是未初始化之前里面是有固定的东西的,不止前20个,对吧? 然后输入一个覆盖一个。
那既然没有'\0'的结束标志,puts()函数又是以什么为结束输出标志的呢? 为什么我运行没有出现你的问题 大魔王S 发表于 2019-3-25 18:42
嗯嗯,感谢
我运行过啦,所以说 :string是未初始化之前里面是有固定的东西的,不止前20个, ...
再看一遍,仍然是到'\0'结束的,未初始化之前字符串里大部分都是'\0';
ShowStrData()输出的上一排就是以十六进制表示的字符的ascii码 在VS里面调试看内存可以看到,为什么以@结束有可能是你编译器用@的ascii码刚好填充了那段区域,vs 2017里面就用 cccc 填充数据。 lemon3 发表于 2019-3-25 18:48
为什么我运行没有出现你的问题
啊 你是在windows系统下面运行的吗 我用的是Dev-C++5.1运行的 RIXO 发表于 2019-3-25 19:42
在VS里面调试看内存可以看到,为什么以@结束有可能是你编译器用@的ascii码刚好填充了那段区域,vs 2017里面 ...
嗯 我的编译器是Dev-C++ 那就是说不同的编译器string未赋值前里面填充的数据还不一样啊 {:7_122:} 大魔王S 发表于 2019-3-25 20:01
嗯 我的编译器是Dev-C++ 那就是说不同的编译器string未赋值前里面填充的数据还不一样啊
C语言的规则只是定义了大部分的东西,还有些东西是由编译器来解释的,有些编译器会将你未初始化的数据初始化为零,有些会填入其他数据,还有不做处理,直接随机数据的,这些都是编程会遇到的错误,但不报语法错误,代码多了也不好找。你代码写的是字符数组,C++里面还有一个string类,用于操作字符串。 RIXO 发表于 2019-3-25 20:07
C语言的规则只是定义了大部分的东西,还有些东西是由编译器来解释的,有些编译器会将你未初始化的数据初 ...
{:10_323:} get it! Thanks!
大魔王S 发表于 2019-3-25 19:59
啊 你是在windows系统下面运行的吗 我用的是Dev-C++5.1运行的
我不知道版本,我也是用的Windows Dev c++,不过我写的c++格式(main函数里面和你一样的),运行正常啊
页:
[1]