十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
让人分析代码,至少要把代码贴出来运行啊,总不可能抄写你的代码吧!
创新互联公司始终坚持【策划先行,效果至上】的经营理念,通过多达十多年累计超上千家客户的网站建设总结了一套系统有效的全网营销推广解决方案,现已广泛运用于各行各业的客户,其中包括:搬家公司等企业,备受客户称赞。
gets和scanf()的区别就是前者接收空格、制表符Tab和回车等,遇见EOF停止!而后者遇见空格、制表符Tab和回车等就停止;
数组只能存1234\0;后面的56789都是越界的;为什么到8没有关系,而是9崩溃是因为你运气好,空闲内存还有;第9个刚好访问了其他程序的内存!
而为什么puts和printf可以打印到8是因为再8后面才遇到'\0';
为什么for只输出4个数;是因为你用的32位编译器,所以sizeof(st)==4;如果你用64的编译器,那么sizeof(st)==8;因为指针大小再32是4个字节,64位8个字节!
好了,老板的4个问题都帮你分析了!给财富值200;
谈不上“危险”,
gets() 函数从标准输入读入 一行文本,直到读到 新行符 或 EOF 字符 之前,不会停止读入文本。也就是:gets() 不检查边界。因此,当变量空间 小于 一行字符串 时, 使用 gets() 会造成 溢出,程序出错。
例如:
#includestdio.h
int main( )
{
char s[5];
printf ("input one line: ");
gets(s);
printf ("%s\n",s);
return 0;
}
这里,char s[5]; 最多存放 5个字符,如果 输入一行字符 太多, 例如 输入了 10 个字符,程序会 出错。出错其实没什么大不了,发现问题,你可以修改 成 char s[15]; 或 输入语句提示
printf ("input one line, less than 5 chars: "); 谈不上“危险”.
您好,很高兴回答您的问题。
您的这个题目,系统已经很明显告诉您了错误的原因。因为您定义的x为字符型数据,那么它对应的输入输出格式符为%c,但是您在输入语句中写的是%s,是字符串格式,不符合字符型单个变量的输入输出。根据题目意思,应该是要输入字符串,那么定义的时候就要写成char x[2],因为存放的是性别中文字,所以数组长度定义为2就可以了。您再试试哦。
是的,如果这是某书上的做法,那么,我只能说它为你们提供了一个错误的榜样。
这样使用gets()已经发生了溢出!这是gets()不检查数据边界的bug造成的。
另外,“字符串不是总是以'\0'作为串的结束符”,答案是肯定的,不然puts()函数就不能在合适的地方停下来了。这里st[15]被gets()函数赋值为'\0'。这里要说明的是st[15],st[16]是存在而不合法的,因为字符串实际上就等同于指针,类似st[16]是实在的地址但是是不应该被引用的。
为什么这里溢出没有产生错误?可能系统分配内存是以一个最小的大小整段整段的分配(这个我只是猜测)。你可以试着输入的字符串变长一点,就可以看到内存读写出错的提示了,这就是溢出的严重后果!我在dos系统下测试字符串长了直接当机。
验证1:st[15]被赋值为'\0'
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
printf("%d",st[15]);
getch();
}
验证2:
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
//printf("%d",st[16]);
st[1]='\0';
printf("%s\n",st);
printf("%s",st+2);
getch();
}
同样的建议:拒绝gets(),这本来就是一个有bug的函数!
scanf(
)函数和gets(
)函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hi
hello",则应该使用__gets__函数。
gets可以接收空格;而scanf遇到空格、回车和
Tab键
都会认为输入结束,所有它不能接收空格。
char
string[15];
gets(string);
/*遇到回车认为输入结束*/
scanf("%s",string);
/*遇到空格认为输入结束*/
所以在输入的字符串中包含空格时,应该使用gets输入。
scanf和gets获取字符串时的区别
在C语言中,能构获取字符串的函数至少有两个:
1.scanf()
所在
头文件
:stdio.h
语法:scanf("格式控制字符串",变量地址列表);
接受字符串时:scanf("%s",
字符数组名
或指针);
2.gets()
所在
头文件
:stdio.h
语法:gets(字符数组名或指针);
两者在接受字符串时:
1.不同点:
scanf不能接受空格、
制表符
Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;
2.相同点:
字符串接受结束后自动加'\0'。
例1:
#include
stdio.h
main()
{
char
ch1[10],
ch2
[10];
scanf("%s",ch1);
gets(ch2);
}
依次键入asd空格fg回车,asd空格fg回车,则ch1="asd\0",ch2="asd
fg\0"。
例2:
#include
stdio.h
main()
{
char
ch1[10],ch2[10],c1,c2;
scanf("%s",ch1);
c1=getchar();
gets(ch2);
c2=getchar();
}
依次键入asdfg回车,asdfg回车,则ch1="asdfg\0",c1='\n',ch2="asdfg\0",c2需输入。
scanf
:当遇到回车,空格和
tab键
会自动在字符串后面添加'\0',但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受
回车键
之前输入的所有字符,并用'\n'替代
'\0'.回车键不会留在输入缓冲区中
gets()用到读取字符串,用回车结束输入
scanf()可以读取所有类型的变量