我输入如下内容:
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);
}
答案 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。