我有一个由多行组成的文件。每行有几个简短的单词。有什么方法可以用 scanf 读取它们并能够确定新行何时开始?我可以读取整行然后拆分它,但问题是我不知道行可以有多大,所以我无法创建固定大小的缓冲区。我想分别阅读每个单词。
问问题
1867 次
2 回答
1
如果你有 POSIX,你可以不通过抽象来解决这个问题,而是通过上升到getline()
.
它基本上是fgets()
通过动态分配来处理任何长度的输入行。
于 2013-11-12T16:30:30.433 回答
1
我想不出这样做的标准方法,所以我实现了自己的读取字符串的函数。该函数scan(s)
返回EOF
、NEW LINE
或NO NEW LINE
。这是代码:
#include <stdio.h>
#include <stdlib.h>
#define NEW_LINE 1
#define NO_NEW_LINE 0
#define MY_EOF -1
int scan(char *s) {
int c = getchar(), idx = 0;
while(c == ' ' || c == '\n') c = getchar();
if(c == EOF) return MY_EOF;
s[idx++] = c;
while(c != ' ') {
c = getchar();
if(c == EOF) {
s[idx] = '\0';
return MY_EOF;
} else if(c == '\n') {
s[idx] = '\0';
return NEW_LINE;
} else s[idx++] = c;
}
s[idx] = '\0';
return NO_NEW_LINE;
}
int main() {
freopen("input.txt", "r", stdin);
char s[500];
int type;
do {
type = scan(s);
puts(s);
if(type == NEW_LINE) printf("<New Line>\n");
fflush(stdout);
} while(type != MY_EOF);
return 0;
}
输入.txt
1| hello world one two
2| three four
3| a man a plan a canal panama
4| race car
5| blah blah
标准输出
1| hello
2| world
3| one
4| two
5| <New Line>
6| three
7| four
8| <New Line>
9| a
10| man
11| a
12| plan
13| a
14| canal
15| panama
16| <New Line>
17| race
18| car
19| <New Line>
20| blah
21| blah
我希望这有帮助 :)
于 2013-11-12T17:33:39.773 回答