鱼C论坛

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

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

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

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

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

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

最佳答案
2019-3-25 17:07:42
大魔王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[i]);
        }
        printf("\n"); 
        for (i=0;i<size;++i){
                 if (sz[i]<=31 || sz[i]>=127) printf(" __");
                 else printf("  %c",sz[i]);
        }
        printf("\n"); 
}


int main()
{
    int i=-1;
    char str[100];
    ShowStrData(str,20); 
    do
    {
        i++;
        scanf("%c",&str[i]);
    }while(str[i]!='#');
    
    ShowStrData(str,20); 
    puts(str);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-24 21:44:08 | 显示全部楼层
会不会是你一不小心多按了个#
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 21:45:40 | 显示全部楼层
  char str[100]={'\0'}; //初始化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-24 21:47:49 | 显示全部楼层
    字符串尾部缺少结束标志 '\0'
        } while(str[i] != '#')       ;
        str[i + 1]  = '\0'           ; // 增加这条代码
        puts(str)                    ;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

嗯 这样是可以啦。谢谢
但是我还想知道为什么没有结束标志它还是结束了,而且以@这个符号结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-25 17:07:42 | 显示全部楼层    本楼为最佳答案   
大魔王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[i]);
        }
        printf("\n"); 
        for (i=0;i<size;++i){
                 if (sz[i]<=31 || sz[i]>=127) printf(" __");
                 else printf("  %c",sz[i]);
        }
        printf("\n"); 
}


int main()
{
    int i=-1;
    char str[100];
    ShowStrData(str,20); 
    do
    {
        i++;
        scanf("%c",&str[i]);
    }while(str[i]!='#');
    
    ShowStrData(str,20); 
    puts(str);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2019-3-25 18:48:51 | 显示全部楼层
为什么我运行没有出现你的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

再看一遍,仍然是到'\0'结束的,未初始化之前字符串里大部分都是'\0';
ShowStrData()输出的上一排就是以十六进制表示的字符的ascii码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

啊 你是在windows系统下面运行的吗 我用的是Dev-C++5.1运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯 我的编译器是Dev-C++ 那就是说不同的编译器string未赋值前里面填充的数据还不一样啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

get it! Thanks!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我不知道版本,我也是用的Windows Dev c++,不过我写的c++格式(main函数里面和你一样的),运行正常啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 12:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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