fscanf()匹配C中的字符串

时间:2018-02-06 13:31:27

标签: c pointers scanf

我有一个这样的文件:

X1034Example
X1234Example2
Y2934Example3

并说我已打开该文件并将其加载到*fp,我现在想要匹配这样的行:“X”后跟4位数后跟任何字符串,所以我假设会是这样的:

FILE **fp;
if ((*fp = fopen(fileName, "r")) == NULL) {
    printf("Unable to read file: %d: %s\n", errno, strerror(errno));
    exit(1);
}

int id; char label[64];
fscanf(*fp, "X%4d%s", &id, label)

但是,这不能正常工作,对于我使用此代码段测试的指定文件:

fscanf(*fp, "X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);

fscanf(*fp, "X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);

我的输出是

1
Example
1
Example

这是因为指针的非确定性行为还是我做错了什么?

修改1

所以在X修复第一个问题之前添加一个空格,但现在我才意识到某些标签中有空格。

例如:

X1245Example Text Here

fscanf(*fp, " X%4d%s", &id, label);
printf("%d\n", id);
printf("%s\n", label);

应该产生:

1245
Example Text Here

1 个答案:

答案 0 :(得分:3)

  

这是因为指针的非确定性行为还是我做错了什么?

fscanf(*fp, "X%4d%s", &id, label)不会消耗前一行的剩余'\n'。请参阅提示:@Some programmer dude。第二个fscanf()简单失败,但未更新id, label。如果代码检查了fscanf()返回值,则可能之前已经捕获过。

使用fscanf(*fp, " X%4d%s", &id, label)(添加空格)或更好,代码fgets(),然后sscanf()该行,并检查扫描的返回值。

int id; char label[64];
char buffer[sizeof label * 2];  // form a generous buffer

if (fgets(buffer, sizeof buffer, stdin)) {
  if (sscanf(*fp, "X%4d%63s", &id, label) == 2) {
    printf("%d\n", id);
    printf("%s\n", label);
  } else {
    Failed();
  }
}

要阅读行的其余部分,而不是"%s"

if (fgets(buffer, sizeof buffer, stdin)) {
  if (sscanf(*fp, "X%4d%63[^\n]", &id, label) == 2) {
    printf("%d\n", id);
    printf("<%s>\n", label);  // added <> to help denote spaces