【问题标题】:fscanf() match string in Cfscanf() 匹配 C 中的字符串
【发布时间】:2018-02-06 13:31:27
【问题描述】:

我有一个这样的文件:

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)

但是,这不能正常工作,对于我使用这个 sn-p 测试的指定文件:

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 步遇到fscanf() 和朋友的问题。测试并报告其返回值。例如。 if (fscanf(*fp, "X%4d%s", &id, label) != 2) Report_Error();
  • 什么是fp?是FILE ** 吗?请尝试创建Minimal, Complete, and Verifiable Example 向我们展示。
  • 作为您的问题的提示,"%s" 格式会跳过(可能的)前导空格,而不是尾随。所以想想文件中每一行的结尾是什么。
  • *fpstdin 时在我的机器上工作正常

标签: c pointers scanf


【解决方案1】:

这仅仅是由于指针的不确定行为还是我做错了什么?

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

【讨论】:

  • 例如,标签字符串中有空格,人们会在那里做什么?即X1242Example Number 2?
  • @Ollu_ 评论不清楚。最好在问题中发布示例输入其期望的结果。
  • 添加到问题底部我的意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2014-11-19
  • 2010-09-30
  • 2011-12-30
相关资源
最近更新 更多