该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有什么大虾们,上面的天体就是我一个在胡扯。
实际应用中永远不要用 gets,因为无法保证用户不会输入过多的字符,引起缓冲区溢出。
可以用 char *fgets(char *s, int size, FILE *stream); 代替。
const int buffer_size = 128;
char buffer[buffer_size];
fgets(buffer, buffer_size, stdin);
用 scanf() 也可以,但是要在 %s 前加上读取的最大长度,确保没有溢出,比如 "%127s"。
用 scanf 读取数字问题很大,如果用户输入非数字字符,几乎可以肯定读不到你需要的东西。
需要用户输入数字,可以用 fgets 当字符串读,然后用
long int strtol(const char *nptr, char **endptr, int base);
和
double strtod(const char *nptr, char **endptr);
处理,转换成数字。其中 strtol 还支持 2-36 进制数的输入。
其实 GUI 下的程序,可以不用担心这些,用户的输入和转换很多时候有现成的控件或库可用。
比如 Edit Box。
通常在 GUI 下的程序,只有在读取文本数据文件时,比如配置文件,才需要自己转换,这些函数的副作用还是要注意的。
最后,为了防止缓冲区溢出,还有一个函数也要注意的
int sprintf(char *str, const char *format, ...);
除非你能确保用的参数的范围,否则也容易出问题。
C99 标准增加了一个函数,取代 sprintf 的,
int snprintf(char *str, size_t size, const char *format, ...);
很多编译器即使还不支持 C99 标准,但是也会加了对这个函数的支持作为扩充,尽量用这个。
哈哈,今天运气好,竟然能登录�