关于一个gets()函数输入数组越界的问题

uiuiooo 2013-02-18 09:51:51
今天看了一个代码,用gets()函数输入字符串。
#include <stdio.h>
#include <string.h>
int main()
{
char msg[40]=" ";
while(1)
{
gets(msg);
if(0==strcmp(msg,"bye"))
break;
puts(msg);
}
return 0;
}
其中数组msg[40]是取40个字符,输入helloworld能够在屏幕上正常回显输出。但若是把40改为2,输入helloworld屏幕上也能正常回显输出,感觉此时数组应该越界了。
问题:
1、越界了能正常输出?数组msg[2]不会把字符串截断吗?
2、能正常输出的话,那么字符数组msg[40]定义的40就可以定义成任何数了,字符数组里的数限制不了字符数组的长度。我见过一些程序一般是把数组设置的足够大,只能用这种方法防止越界?有没有其他方法如果越界了的话能给与提示。
3、在网上看到gets函数很危险,不推荐使用。推荐fgets函数,但fgets函数是从文件输入的字符串。我现在想实现从键盘输入字符串存到数组里的功能,但又想避免越界。有没有好的方法?
...全文
1075 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobao929 2013-02-21
  • 打赏
  • 举报
回复
引用 3 楼 ForestDB 的回复:
对于问题1,2,这都是C程序员自己的责任。 对于问题3:fgets(buffer, buffer_size, stdin);可以从标准输入(即键盘)。
正解
starytx 2013-02-19
  • 打赏
  • 举报
回复 1
c风格的字符串截断靠的是空字符'\0',字符数组不保证这个空字符的位置,越界了还能正常显示,只能说明是个巧合,超出的部分还未被其他数据覆盖而已
赵4老师 2013-02-19
  • 打赏
  • 举报
回复
电脑内存只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、……
AnYidan 2013-02-18
  • 打赏
  • 举报
回复
引用 楼主 uiuiooo 的回复:
今天看了一个代码,用gets()函数输入字符串。 #include <stdio.h> #include <string.h> int main() { char msg[40]=" "; while(1) { gets(msg); if(0==strcmp(msg,"bye")) break; puts(msg); } return 0; } 其中数组……
三个问题归结为一个,越界了会发生什么? 会一直写下去,覆盖后面的数据,至于后面是什么数据,那要看人品了
ForestDB 2013-02-18
  • 打赏
  • 举报
回复
对于问题1,2,这都是C程序员自己的责任。 对于问题3:fgets(buffer, buffer_size, stdin);可以从标准输入(即键盘)。
囧囧囧1024 2013-02-18
  • 打赏
  • 举报
回复


实际上,char msg[10],编译器不仅仅只分配了10个空间,还额外分配了些。
你是用的VC6.0吧,假设你char msg[4],你输入6个字符是一点问题不会出现,实际上你如果再把字符串输入长一点,比如100,你自己就能发现问题。

但是用VS的话,这个问题只要超过你定义的大小,就会弹出一个大大Debug error
赵4老师 2013-02-18
  • 打赏
  • 举报
回复
1、2、操作系统内存管理的功能做不到精确到每个字节(和警察管治安管不到每个角落一样) 3、
#include <stdio.h>
#include <string.h>
int main() {
    char msg[40];
    while (1)  {
        if (NULL==fgets(msg,40,stdin)) break;
        if ('\n'==msg[strlen(msg)-1]) msg[strlen(msg)-1]=0;
        if (0==strcmp(msg,"bye")) break;
        puts(msg);
    }
    return 0;
}
//分别输入长度不超过40、刚好40、大于40的字符串回车结束试试
//输入Ctrl+Z回车再试试

70,029

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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