用C中的scanf检测新行

时间:2013-11-12 16:14:21

标签: c scanf

我有一个由多行组成的文件。在每一行中都有几个简短的单词。有没有办法用scanf读取它们并能够确定新行何时开始?我可以读取整行,然后拆分它,但问题是我不知道线条有多大,所以我不能创建固定大小的缓冲区。我想分别阅读每个单词。

2 个答案:

答案 0 :(得分:1)

如果你有POSIX,你可以解决这个问题,不是通过抽象,而是通过up to getline()

它基本上是fgets(),通过动态分配它来处理任何长度的输入行。

答案 1 :(得分:1)

我想不出这样做的标准方法,所以我实现了自己的函数来读取字符串。函数scan(s)返回EOFNEW LINENO 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;
}

<强> input.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

我希望这会有所帮助:)