扫描多行,直到到达特定字符

问题描述 投票:0回答:2

我有如下输入:

Someting sth
example
 5  15   
3

我想按行输入scanf以获取行的全部内容。但是当到达第一个数字时(前面可能有空格/制表符),我想将其扫描为int。

这就是我想出的,但是它不能按预期工作-光标仍然不会停在数字字符上。

char person_name[1000];
int n;

while (scanf("%[^\n/D]%*c", person_name) > 0) {
    if (checkIfContainsNumber(person_name) == 0) {
      appendToLinkedList(&head_ref, person_name);
    } else {
      break;
    }
}

while (scanf("%d", &n) > 0) {
    printf("%d ", n);
}
c scanf
2个回答
0
投票

考虑更改扫描策略-忽略所有非数字字符,然后向前读取该数字中的整数

if ( scanf("%*[^0-9]%d", &n) == 1 ) { ... }

第一个字段'%* [...]'将跳过任何非数字的内容。请注意,如果需要检查语句,可以在找到数字之前达到EOF。


0
投票

据我了解的问题,每一行都可以视为名称序列或整数序列。因此,我将尝试逐行读取文件并分析每个提取的行作为一个序列或另一个序列(空间被隐式消耗)。这里的技巧是使用"%n"在同一行的分析中更进一步。

#include <stdio.h>

int
main(void)
{
  FILE *input=fopen("input.txt", "r");
  if(!input)
  {
    return 1;
  }
  char line[1024];
  while(fgets(line, sizeof(line), input))
  {
    int pos=0;
    int value, count;
    char name[256];
    if(sscanf(line+pos, "%d%n", &value, &count)==1)
    {
      pos+=count;
      printf("a line with values: <%d>", value);
      while(sscanf(line+pos, "%d%n", &value, &count)==1)
      {
        pos+=count;
        printf(" <%d>", value);
      }
      printf("\n");
    }
    else if(sscanf(line+pos, "%255s%n", name, &count)==1)
    {
      pos+=count;
      printf("a line with names: <%s>", name);
      while(sscanf(line+pos, "%255s%n", name, &count)==1)
      {
        pos+=count;
        printf(" <%s>", name);
      }
      printf("\n");
    }
  }
  fclose(input);
  return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.