关于一个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回车再试试