拷贝字符串代码的疑问

paul卢 2015-08-21 10:01:14
请问为什么要加b[i]=0呢?去掉的话为什么会出现“烫烫烫烫?”这些乱码?
for(i=0;a[i];i++)在其中的作用是什么?
#include<stdio.h>
#include <string.h>
main()
{
char a[10],b[10];
int i;
scanf("%s",a);
for(i=0;a[i];i++) b[i]=a[i];
b[i]=0;
printf("%s\n",b);
}
...全文
165 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xade 2015-08-25
  • 打赏
  • 举报
回复
用a[]不用i<10的原因是因为a里面的“正确信息”可能不到10个字符,所以以a[i]是否为0值来判断。 另外,如果你是要输入10个数,然后赋值给b[10]的话,你找的例子就不对。 你在顶楼贴的这段代码的作用是:从键盘接收一个10字符以内(最多9字符)的字符串,保存到a,然后复制到b。 这段代码和你说的目的完全不一样。 另外如果你输入超过9个字符也可能会出问题。至于为什么是9个,是因为要留一个位置给结束字符的0值。 建议楼主找一本C的基本教材作为参考书,谭某的那本应该就可以。
xade 2015-08-25
  • 打赏
  • 举报
回复
引用 4 楼 luyu534 的回复:
能说的再详细点吗? for里为什么用a[]而不是i<10,后面为什么会遇到自赋值是0,以及b[i]不加0后面还有什么数据会被读出来? 新手不懂得太多,望赐教
字符(char)类型的0值是一个特殊的字符,表示字串结束。 for里那个a[i]是判断当前a[]里面的字符是不是0值,是0就结束循环的意思。 程序执行到 b[i]=0 的时候,b[i] 正处于复制完了a里面的字符的位置,这个时候应该把b加上字串结束标记,b[i]=0 的作用就是这个。如果不执行这一句的话,读取b的时候就不知道字串已经结束了,就会把后面的数据一起读出来,显示到屏幕上就是乱码了。
二班的码农 2015-08-25
  • 打赏
  • 举报
回复
你输入的用例是什么,还有,你只定义10个长度的字符数组,最多只能承接9个长度的字符串,因为最后一个得存'\0' 还有,楼主你是用哪段代码测试的
paul卢 2015-08-25
  • 打赏
  • 举报
回复
引用 9 楼 ant2012 的回复:
此程序运行没有问题 如果想规范写法,如: #include<stdio.h> #include <string.h> main() { char a[10],b[10]; int i; scanf("%s",a); for(i=0;a[i] != ‘\0’;i++) b[i]=a[i]; b[i]='\0'; printf("%s\n",b); } 或者直接用库函数 #include<stdio.h> #include <string.h> main() { char a[10],b[10]; int i; scanf("%s",a); strcpy(b, a); printf("%s\n",b); } 如果编译提示,strcpy不安全,建议用strcpy_s,那你就替换成strcpy_s
本意是输入10个数给a[10],然后将a[10]赋值给b[10],但是程序运行却只能复制一个数,这是怎么回事呢?
欧阳春晖 2015-08-25
  • 打赏
  • 举报
回复
这b[i]=0的目的是在字符串结尾的部分加一个结束符,否则就越界了
paul卢 2015-08-25
  • 打赏
  • 举报
回复
引用 13 楼 xade 的回复:
用a[]不用i<10的原因是因为a里面的“正确信息”可能不到10个字符,所以以a[i]是否为0值来判断。 另外,如果你是要输入10个数,然后赋值给b[10]的话,你找的例子就不对。 你在顶楼贴的这段代码的作用是:从键盘接收一个10字符以内(最多9字符)的字符串,保存到a,然后复制到b。 这段代码和你说的目的完全不一样。 另外如果你输入超过9个字符也可能会出问题。至于为什么是9个,是因为要留一个位置给结束字符的0值。 建议楼主找一本C的基本教材作为参考书,谭某的那本应该就可以。
但是运行时却只能输入一个数,然后输出的也是一个数
此后三年 2015-08-24
  • 打赏
  • 举报
回复
为什么会出现“烫烫烫烫?”这些乱码? 这是vs里才看到的东西, 不要在意,问题的关键是你使用了未初始化的变量。 char a[10],b[10]; int i; scanf("%s",a); for(i=0;a[i];i++) b[i]=a[i]; //a[i]的值是不确定的, 这才是致命的问题, 会导致死循环!!! b[i]=0; //加结束符, 但是这样写极有可能下标越界, 太不规范
自信男孩 2015-08-24
  • 打赏
  • 举报
回复
就是一个字符串结束标记,'\0'和0的值是一样的。 需要弄明白的:0,'0'和‘\0'的区别
二班的码农 2015-08-24
  • 打赏
  • 举报
回复
引用 楼主 luyu534 的回复:
请问为什么要加b[i]=0呢?去掉的话为什么会出现“烫烫烫烫?”这些乱码? for(i=0;a[i];i++)在其中的作用是什么? #include<stdio.h> #include <string.h> main() { char a[10],b[10]; int i; scanf("%s",a); for(i=0;a[i];i++) b[i]=a[i]; b[i]=0; printf("%s\n",b); }
其实 for(i=0;a[i];i++) 等价于for(i = 0; a[i] != '\0'; i++) //‘\0’的ascii值就是0 for(i=0;a[i];i++),不管怎么说,这种写法不规范,容易让人误以为a[]数组存放的是布尔型数据 因为楼主,你虽然给a[]字符数组定义了长度为10,但你在输入时,可能并没有输入10个长度的字符串,用a[i] != '\0'可以减少循环次数,提高执行效率 b[i]=0; 等价于b[i] = '\0'; 目的是给字符串末尾加上‘\0'因为很多函数是通过'\0'来判断字符串的结尾的
paul卢 2015-08-24
  • 打赏
  • 举报
回复
引用 2 楼 xade 的回复:
for(i=0;a[i];i++) b[i]=a[i]; 这句的作用是把 a 里面的字符挨个复制到b,遇到字符值是 0 就结束复制的循环。 b[i]=0 是给b加上0字符的字串结束标记,不然后面的数据也会被当成字符串内容读出来。 "烫烫烫烫"这个很经典了,这个是debug编译下内存被全部填入 0xCC 的结果,因为 0xCCCC 就是一个‘烫’字的编码,所以一串 0xCC 显示出来就是“烫烫烫烫……”
能说的再详细点吗? for里为什么用a[]而不是i<10,后面为什么会遇到自赋值是0,以及b[i]不加0后面还有什么数据会被读出来? 新手不懂得太多,望赐教
二班的码农 2015-08-24
  • 打赏
  • 举报
回复
此程序运行没有问题 如果想规范写法,如: #include<stdio.h> #include <string.h> main() { char a[10],b[10]; int i; scanf("%s",a); for(i=0;a[i] != ‘\0’;i++) b[i]=a[i]; b[i]='\0'; printf("%s\n",b); } 或者直接用库函数 #include<stdio.h> #include <string.h> main() { char a[10],b[10]; int i; scanf("%s",a); strcpy(b, a); printf("%s\n",b); } 如果编译提示,strcpy不安全,建议用strcpy_s,那你就替换成strcpy_s
paul卢 2015-08-24
  • 打赏
  • 举报
回复
引用 7 楼 a30037338 的回复:
为什么会出现“烫烫烫烫?”这些乱码? 这是vs里才看到的东西, 不要在意,问题的关键是你使用了未初始化的变量。 char a[10],b[10]; int i; scanf("%s",a); for(i=0;a[i];i++) b[i]=a[i]; //a[i]的值是不确定的, 这才是致命的问题, 会导致死循环!!! b[i]=0; //加结束符, 但是这样写极有可能下标越界, 太不规范
请问正确的应该怎么写啊 我这是照着PPT自学的
赵4老师 2015-08-21
  • 打赏
  • 举报
回复
windows里常见的内存填充数据含义
* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory
* 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers
* 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory
* 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger
* 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files
* 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory
* 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory
* 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash
* 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory
* 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory
xade 2015-08-21
  • 打赏
  • 举报
回复
for(i=0;a[i];i++) b[i]=a[i]; 这句的作用是把 a 里面的字符挨个复制到b,遇到字符值是 0 就结束复制的循环。 b[i]=0 是给b加上0字符的字串结束标记,不然后面的数据也会被当成字符串内容读出来。 "烫烫烫烫"这个很经典了,这个是debug编译下内存被全部填入 0xCC 的结果,因为 0xCCCC 就是一个‘烫’字的编码,所以一串 0xCC 显示出来就是“烫烫烫烫……”
jiqiang01234 2015-08-21
  • 打赏
  • 举报
回复
char a[10]={0}; char b[10]={0};

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧