A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 执着的土豆 中级黑马   /  2014-4-28 20:52  /  13491 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 执着的土豆 于 2014-4-28 22:36 编辑

字符串后面不是自动加\0得么?printf()在遇到\0不是应该自动停止得吗?为什么会输出乱码呢?  请高手详细解释一下。
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         char a[10],b[10]="string";
  6.         int i=0;
  7.         for(;i<strlen(b);++i)
  8.                 a[i]=b[i];
  9.         printf("%s\n",a);
  10.         return 0;
  11. }
复制代码




  谢谢各位的详细解答!     绕闷。试了一下,确实是没有把\0导入到第一个数组中,导致printf()函数输出的时候找不到\0,所以继续输出后面内存空间中的值,出现的乱码。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

7 个回复

倒序浏览
好久没写C了,你这代码一看就知道错在哪里!
printf("%s\n",a);!!!!!!!!!!!自己好好想想这句应该写什么!a是啥?
回复 使用道具 举报
也好久没看c了, 也很想反问楼主, 你那a是啥?
  c里面最恼人的东西。
回复 使用道具 举报
#include<stdio.h>
#include<string.h>
int main()
{
        char a[10],b[10]="string";
        int i=0;
        for(;i<strlen(b);++i)//strlen计算长度的时候是不算'\0'的
                a[i]=b[i];//这里赋值的时候没有把'\0'赋给a,你可以用for打印一下a的每个字符试试
        printf("%s\n",a);
        return 0;
}
回复 使用道具 举报
  1. #include<stdio.h>
  2. #include<string.h>
  3. int main()
  4. {
  5.         char a[10],b[10]="string";
  6.         int i=0;
  7.         for(;i<strlen(b);++i)
  8.                 a[i]=b[i];
  9.         printf("%s\n",a);
  10.         return 0;
  11. }
复制代码

觉得应该是这个样子 strlen返回的是string的长度,也就是,6个。最后一个\0没算进去。
所以循环的时候,也就没有循环到b[6],就是最后复制的之后,没有把b的最后一个\0复制到a里,试下
for(;i<(strlen(b)+1);++i)

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
ò壞尛孩 发表于 2014-4-28 20:57
好久没写C了,你这代码一看就知道错在哪里!
printf("%s\n",a);!!!!!!!!!!!自己好好想想这句应该写什么!a ...

这样是可以输出得啊,会输出string,但是后面会有乱码 啊。  
回复 使用道具 举报
执着的土豆 发表于 2014-4-28 21:07
这样是可以输出得啊,会输出string,但是后面会有乱码 啊。

确实可以输出 可惜手上没有c编译器。
回复 使用道具 举报
执着的土豆 发表于 2014-4-28 21:07
这样是可以输出得啊,会输出string,但是后面会有乱码 啊。

a+"\0"试试!我C编译器早就不在了,没办法帮你试,
还有个问题就是b长度是10 你试试打印strlen(b)看看是10还是6
我觉得以上都应该不是问题!
整个程序都没有用到String.h 你导入也没用
你定义的是char[]数组,在c中打印char是%c吧  我忘记了 好像%s也能接受char!但是这里的a是数组不是字符串!问题出在这!
给你两个建议
1、吧char[]改成 String   用Strcpy函数
2、用char[],+\0再强转String
我记得以前写的时候都会在循环外加一句a=0或者\0!你想想你忘记这个没!

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马