我经历了很多问题,博客和书籍,但我想我还没有能够正确地解决问题。 scanf扫描后做了什么?它会读取除空格,制表符和换行符之外的所有内容,但它对换行符有什么作用? 扫描输入后,我无法以任何方式删除换行符。 例如,将此视为输入: -
5
ABCDEFGH
现在,我已将5扫描为整数,
scanf("%d", &i);
但如何删除' \ n'为了一次只读一个字符?我想用: -
while((c=getchar())!='\n'){//Do something}
' \ n'应该是字符串之后的那个,但是getchar()在5之后得到一个并且循环在甚至运行一次之前终止。我想我只是错过了一个小技巧。
scanf("%d", &i);
while((c=getchar())!='\n'){
//Do something with the character
}
输入文件: -
5
ABCDEF
期待while循环运行,而它不会运行。因为它抓住了' \ n' 5.我尝试在scanf()和while()之间添加getchar(),但是程序卡住并且什么都不做。
答案 0 :(得分:3)
如果在%d
格式说明符中的scanf
之后添加空格,scanf
将不会返回,直到遇到任何非空白字符。这将有效地消耗输入中的任意数量的换行符或其他空格。正如@BlueMoon所指出的那样,请注意这个依赖来接收新行后接收更多非空白输入的程序。所以它适用于这个例子,但可能在其他地方引起麻烦。
这是一个最小的例子:
#include <stdio.h>
int main()
{
int i, j=0;
char c;
scanf("%d ", &i);
while((c=getchar())!='\n') printf("%d: %c\n", j++, c);
return 0;
}
示例输入:
5
abcdefg
输出:
0: a
1: b
2: c
3: d
4: e
5: f
6: g
编辑:请注意,可以使用fgets
将行读入字符缓冲区,然后使用sscanf
提取整数来规避此问题:
char buff[SIZE];
fgets(buff, SIZE, stdin);
sscanf(buff, "%d ", &i);
while((c=getchar())!='\n') printf("%d: %c\n", j++, c);
fgets
读取,直到遇到换行符或文件结尾,或者已读取SIZE-1
个字节。假设您只希望该行包含一个整数,则此限制不应成为问题。只要SIZE
足够大,新行就会被fgets
使用,并且循环中的后续getchar
将按预期工作。
答案 1 :(得分:1)
由于您使用的是Windows,'\r'
字符前面有'\n'
个字符。
&#34;在getchar();
循环之前添加while
&#34;诀窍不起作用,因为getchar()
获得'\r'
字符。因此,首次评估while
条件时,c
为'\n'
。
因此,一个简单的解决方法是使用两个getchar()
调用来使用'\r\n'
。但是,这不是很便携,也就是说,它不能在其他系统上工作。
所以我会使用以下内容:
int main() {
int i;
char c;
scanf("%d", &i);
if(getchar()=='\r') getchar();
while((c=getchar())!='\n') {
printf("%c\n", c);
}
return 0;
}
答案 2 :(得分:0)
您可以在getchar()
调用后立即使用scanf()
使用\n
,以便它不会干扰您的循环。
scanf("%d", &i);
getchar(); // To consume the trailing newline left
//in the input stream by scanf().
while((c=getchar())!='\n'){
//Do something
}
#include <stdio.h>
int main(void)
{
int i, j=0;
char c;
scanf("%d", &i);
getchar();
printf("%d\n", i);
while((c=getchar())!='\n'){
printf("%c-", c);
}
return 0;
}
我和你一样运行上面的代码:./a.out < file
在Linux上和使用mingw
的Windows上,我没有看到任何问题。
答案 3 :(得分:0)
如果您接受字符或字符串输入,请在每个整数输入后使用getchar()
。这将从输入缓冲区中删除\n
。
scanf("%d", &i);
getchar();
while((c=getchar())!='\n'){//Do something}