我正在使用fgets和stdin读取一些数据,最大长度为25。在我运行此代码的一个测试中,我想要的数据后面有几百个空格,这会导致程序失败。
有人能告诉我如何在使用fgets时忽略所有这些额外的空格并转到下一行吗?
有人能告诉我如何在使用fgets时忽略所有这些额外的空格并转到下一行吗?
fgets()
迭代读取字符串,然后扫描该字符串以查看是否全部为空格(以及是否以换行符结尾),如果是则忽略它。或者改用循环中的 getc()
或 getchar()
?char buffer[26];
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
...process the first 25 characters...
int c;
while ((c = getchar()) != EOF && c != '\n')
;
}
这段代码会忽略所有字符直到下一个换行符。如果你想确保它们是空格,可以在(内部)循环中添加一个测试,但你必须决定如果字符不是空格要做什么。
解释Jonathan Leffler关于getc()的建议:
我假设你有一个像这样的循环:
while (!feof(stdin)) {
fgets(buf, 25, stdin);
...
}
将它改成这样:
while (!feof(stdin)) {
int read = fgets(buf, 27, stdin);
if (read > 26) { // the line was *at least* as long as the buffer
while ('\n' != getc()); // discard everything until the newline character
}
...
}
编辑:啊,Jonathan 写 C 的速度比我快。:)
getc()
需要一个文件指针(假设是stdin),而getchar()
则默认使用stdin。另外要注意EOF - 如果文件中没有剩余的换行符,你的内部循环将不会停止。 - Jonathan Leffler尝试使用以下代码,以去除字符串末尾的空格。
char str[100] ;
int i ;
fgets ( str , 80 , stdin ) ;
for ( i=strlen(str) ; i>0 ; i-- )
{
if ( str[i] != ' ' )
{
str[i+1]='\0';
break ;
}
}
c
声明为一个int
而不是一个char
;在换行符之前测试了 EOF,尽管如果您将其分配给一个int
而不是一个char
,它也可以以另一种方式工作。请记住,函数(宏)getc()
和getchar()
返回的是整数而不是char
。任何被告知三次的事情都是真的。 - Jonathan Leffler