首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-03-01 
关于一个gets()函数输入数组越界的问题今天看了一个代码,用gets()函数输入字符串。#include stdio.h#incl

关于一个gets()函数输入数组越界的问题
今天看了一个代码,用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函数是从文件输入的字符串。我现在想实现从键盘输入字符串存到数组里的功能,但又想避免越界。有没有好的方法?
[解决办法]
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回车再试试

[解决办法]
对于问题1,2,这都是C程序员自己的责任。
对于问题3:fgets(buffer, buffer_size, stdin);可以从标准输入(即键盘)。

热点排行
Bad Request.