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

时间:2019-10-18 10:12:42

标签: c scanf

我输入如下内容:

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);
}

3 个答案:

答案 0 :(得分:1)

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

"%n"

答案 1 :(得分:1)

使用fgets逐行读取输入,并保持以下模式:TEXT表示文本,NUMBER表示数字,ERROR表示错误情况。 (错误条件没有描述。例如,当您在NUMBER模式下遇到非数字数据时,可能会发生这种情况。)

TEXT开始。在文本模式下处理一行之前,请通过简单的sscanf检查该行是否为数字。如果您可以阅读数字,请切换到数字模式,在该模式下您可以扫描一行中的所有数字。

char line[80];
enum {TEXT, NUMBER, ERROR = -1} mode = TEXT;

while (mode != ERROR && fgets(line, sizeof(line), stdin)) {
    if (mode == TEXT) {
        int n;

        if (sscanf(line, "%d", &n) > 0) mode = NUMBER;
    }

    if (mode == TEXT) {
        line[strcspn(line, "\n")] = '\0';
        process_string(line);
    } else if (mode == NUMBER) {
        char *p = line;
        char *end;
        int n = strtol(p, &end, 0);

        if (end == p) mode = ERROR;

        while (end > p) {
            process_number(n);
            p = end;
            n = strtol(p, &end, 0);
        }            
    }
}

(但是,如果数字都是很长的,这种方法将失败。fgets会截断输入,以便不会超出指定的大小。)

答案 2 :(得分:0)

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

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

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