我正在使用freopen函数来读取文件。但是当我使用scanf语句扫描整数时,它会跳过 '\n' 字符。如何避免 scanf 跳过'\n'。
问问题
355 次
3 回答
1
建议发布更多您的编码目标,以便我们建议如何避免“不跳过\n”的需要。
scanf()
不跳过'\n'
。选择格式指定类似"%d"
直接scanf()
跳过领先的空白 - 包括'\n'
.
如果要使用scanf()
而不是跳过'\n'
,请使用格式说明符,例如"%[]"
or "%c"
。或者,尝试使用fgets()
or的新方法fgetc()
。
如果代码在扫描时必须使用scanf()
而不是跳过前导,建议如下:'\n'
int
char buf[100];
int cnt = scanf("%99[-+0123456789 ]", buf);
if (cnt != 1) Handle_UnexpectedInput(cnt);
// scanf the buffer using sscanf() or strtol()
int number;
char sentinel
cnt = sscanf(buf, "%d%c", &number, &sentinel);
if (cnt != 1) Handle_UnexpectedInput(cnt);
替代方案:首先使用所有前导空格,寻找\n
.
int ch;
while ((ch = fgetc(stdin)) != '\n' && isspace(ch));
ungetc(ch, stdin);
if (ch == '\n') Handle_EOLchar();
int number;
int cnt = scanf("%d", &number);
if (cnt != 1) Handle_FormatError(cnt);
于 2014-03-11T16:11:46.597 回答
0
你不能!但别担心,有解决方法。
解决方法:
一次读取一行输入(使用 fgets),然后用于sscanf
扫描整数。
#define LINE_MAX 1000
line[LINE_MAX];
int num;
while (fgets(line, LINE_MAX, fp) != NULL) {
if (sscanf(line, "%d", &num) == 1) {
// Integer scanned successfully
}
}
于 2014-03-11T14:52:06.707 回答
0
xscanf
函数将由 DFA 处理字符串。它将搜索fmt参数给出的格式,每个空格字符(空格、\t、\n、\r 等)将被跳过。您可以将这些空格字符插入fmt进行匹配。
例如,它是如何跳过的:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char* s = "1 2 \n 3 4 \n 5 \n \n \n 6";
int i,c;
int tot=0;
while(sscanf(s+tot,"%d%n",&i,&c)){
printf("'%s':%d,cnt=%d\n",s+tot,i,c);
tot += c;
}
return 0;
}
/*** Output:
'1 2
3 4
5
6':1,cnt=1
' 2
3 4
5
6':2,cnt=2
'
3 4
5
6':3,cnt=4
' 4
5
6':4,cnt=2
'
5
6':5,cnt=4
'
6':6,cnt=8
'':6,cnt=8
***/
于 2014-03-12T13:36:04.487 回答