作者ssagit (ssagit)
看板Programming
标题Re: 关於gets(const char *)的用法?
时间Sun Sep 10 11:44:23 2006
※ 引述《jtmh (Believing is seeing! ^^)》之铭言:
: ※ 引述《ssagit (ssagit)》之铭言:
: : 也不是不行, Try:
: : char s[100];
: : scanf("%[^\n]", s);
: 这个的确可以读取一整行,
: 不过还是会有前述 keyboard buffer 中残留字元的问题要解决。
: : printf("%s\n", s);
我只能说, scanf 的问题可能比 gets 还要多,
scanf("%s", s); 这样的语法, 它一样不会检查是不是超过 s 的长度,
和 gets 一样会有 buffer overflow 的问题....
而上面的程式如果要连续读两行,
可以写成:
scanf("%[^\n]
\n", s);
scanf("%[^\n]", t);
但是这样读完还是会剩一个 \n 没读进来,
而如果改成下面的写法,
scanf("%[^\n]
\n", s);
scanf("%[^\n]
\n", t);
也就是第二行也加上 \n, 则你第三行也要输入点东西,
否则它不会跳出来.... (我使用 Dev-C++)
而上面第一个的例子, 如果一开始就直接按 Enter,
s 会根本没读到东西而变成乱码,
还有原本要用 %d 读资料时, 使用者输入了非数字的字串,
也会造成之後程式读到的都不对,
综合来说, 遇到不照规距输入的时候,
scanf 会遇到更多问题,
所以我以前写 DOS 程式的时候,
我宁可用 getc 一个字一个字读进来再做处理,
或是用 gets、fgets 一次读一行,
读进来再用 sscanf 或 atoi 之类的函数再处理.....
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.74.191.133