鱼C论坛

 找回密码
 立即注册
查看: 2284|回复: 14

[已解决]关于字符串的一个小问题

[复制链接]
发表于 2019-3-24 21:35:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.           int i=-1;
  6.           char str[100];
  7.     do
  8.     {
  9.               i++;
  10.               scanf("%c",&str[i]);
  11.         }while(str[i]!='#');
  12.         puts(str);
  13.         return 0;
  14. }
复制代码
当你输入 8/(5+2)-6#  这个字符串的时候,输出末尾会有一个@的符号,这是为什么呀

最佳答案
2019-3-25 17:07:42
大魔王S 发表于 2019-3-25 16:33
嗯 这样是可以啦。谢谢
但是我还想知道为什么没有结束标志它还是结束了,而且以@这个符号结束


因为‘@’本来就在那个位置啊,
写了个函数ShowStrData(),自己运行一下,看看string里的数据是如何变化的
  1. #include<stdio.h>
  2. void ShowStrData(char* sz,int size){
  3.         int i;
  4.         printf("\n");
  5.         for (i=0;i<size;++i){
  6.                 printf(" %02X",sz[i]);
  7.         }
  8.         printf("\n");
  9.         for (i=0;i<size;++i){
  10.                  if (sz[i]<=31 || sz[i]>=127) printf(" __");
  11.                  else printf("  %c",sz[i]);
  12.         }
  13.         printf("\n");
  14. }


  15. int main()
  16. {
  17.     int i=-1;
  18.     char str[100];
  19.     ShowStrData(str,20);
  20.     do
  21.     {
  22.         i++;
  23.         scanf("%c",&str[i]);
  24.     }while(str[i]!='#');
  25.    
  26.     ShowStrData(str,20);
  27.     puts(str);

  28.     return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-24 21:44:08 | 显示全部楼层
会不会是你一不小心多按了个#
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 21:45:40 | 显示全部楼层
  char str[100]={'\0'}; //初始化
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 21:47:49 | 显示全部楼层
    字符串尾部缺少结束标志 '\0'
  1.         } while(str[i] != '#')       ;
  2.         str[i + 1]  = '\0'           ; // 增加这条代码
  3.         puts(str)                    ;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-3-25 16:33:21 | 显示全部楼层
jackz007 发表于 2019-3-24 21:47
字符串尾部缺少结束标志 '\0'

嗯 这样是可以啦。谢谢
但是我还想知道为什么没有结束标志它还是结束了,而且以@这个符号结束
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-25 17:07:42 | 显示全部楼层    本楼为最佳答案   
大魔王S 发表于 2019-3-25 16:33
嗯 这样是可以啦。谢谢
但是我还想知道为什么没有结束标志它还是结束了,而且以@这个符号结束


因为‘@’本来就在那个位置啊,
写了个函数ShowStrData(),自己运行一下,看看string里的数据是如何变化的
  1. #include<stdio.h>
  2. void ShowStrData(char* sz,int size){
  3.         int i;
  4.         printf("\n");
  5.         for (i=0;i<size;++i){
  6.                 printf(" %02X",sz[i]);
  7.         }
  8.         printf("\n");
  9.         for (i=0;i<size;++i){
  10.                  if (sz[i]<=31 || sz[i]>=127) printf(" __");
  11.                  else printf("  %c",sz[i]);
  12.         }
  13.         printf("\n");
  14. }


  15. int main()
  16. {
  17.     int i=-1;
  18.     char str[100];
  19.     ShowStrData(str,20);
  20.     do
  21.     {
  22.         i++;
  23.         scanf("%c",&str[i]);
  24.     }while(str[i]!='#');
  25.    
  26.     ShowStrData(str,20);
  27.     puts(str);

  28.     return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-25 18:42:40 | 显示全部楼层
Croper 发表于 2019-3-25 17:07
因为‘@’本来就在那个位置啊,
写了个函数ShowStrData(),自己运行一下,看看string里的数据是如何变 ...

嗯嗯,感谢
我运行过啦,所以说 :string是未初始化之前里面是有固定的东西的,不止前20个,对吧? 然后输入一个覆盖一个。
那既然没有'\0'的结束标志,puts()函数又是以什么为结束输出标志的呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-25 18:48:51 | 显示全部楼层
为什么我运行没有出现你的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-25 18:56:13 | 显示全部楼层
大魔王S 发表于 2019-3-25 18:42
嗯嗯,感谢
我运行过啦,所以说 :string是未初始化之前里面是有固定的东西的,不止前20个, ...

再看一遍,仍然是到'\0'结束的,未初始化之前字符串里大部分都是'\0';
ShowStrData()输出的上一排就是以十六进制表示的字符的ascii码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-25 19:42:20 | 显示全部楼层
在VS里面调试看内存可以看到,为什么以@结束有可能是你编译器用@的ascii码刚好填充了那段区域,vs 2017里面就用 cccc 填充数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-25 19:59:29 | 显示全部楼层
lemon3 发表于 2019-3-25 18:48
为什么我运行没有出现你的问题

啊 你是在windows系统下面运行的吗 我用的是Dev-C++5.1运行的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-25 20:01:57 | 显示全部楼层
RIXO 发表于 2019-3-25 19:42
在VS里面调试看内存可以看到,为什么以@结束有可能是你编译器用@的ascii码刚好填充了那段区域,vs 2017里面 ...

嗯 我的编译器是Dev-C++ 那就是说不同的编译器string未赋值前里面填充的数据还不一样啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-25 20:07:17 | 显示全部楼层
大魔王S 发表于 2019-3-25 20:01
嗯 我的编译器是Dev-C++ 那就是说不同的编译器string未赋值前里面填充的数据还不一样啊

C语言的规则只是定义了大部分的东西,还有些东西是由编译器来解释的,有些编译器会将你未初始化的数据初始化为零,有些会填入其他数据,还有不做处理,直接随机数据的,这些都是编程会遇到的错误,但不报语法错误,代码多了也不好找。你代码写的是字符数组,C++里面还有一个string类,用于操作字符串。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-3-25 20:51:28 | 显示全部楼层
RIXO 发表于 2019-3-25 20:07
C语言的规则只是定义了大部分的东西,还有些东西是由编译器来解释的,有些编译器会将你未初始化的数据初 ...

get it! Thanks!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-25 21:13:44 | 显示全部楼层
大魔王S 发表于 2019-3-25 19:59
啊 你是在windows系统下面运行的吗 我用的是Dev-C++5.1运行的

我不知道版本,我也是用的Windows Dev c++,不过我写的c++格式(main函数里面和你一样的),运行正常啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-6 19:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表