我正在进行一个项目,该项目将使驱动程序将其输出重定向到我的程序的标准输入中,我如何能够扫描该程序向我的程序提供的内容,并使我的程序做出相应的响应。我在考虑使用scanf
,这样行吗?
其他信息:在输入的第一行(在许多行中(,驱动程序给出一个以换行符(\n(结尾的数字。根据这个数字,我的程序将解析输入中的其余行并输出响应。每一行都是一个随机字母的字符串,我的程序需要为每个字符串动态分配内存。这些字符串将是链表中结构的一部分。
您可以像对待常规控制台输入一样对待输入,所有控制台stdio输入调用都可以工作。只是不要试着和它谈话
Enter foodle count : dd
Invalid number
Enter Foodle count :
因为的另一端没有人
通常建议使用比scanf
更健壮的方法,因为它充满了边缘情况,并且几乎没有提供从坏输入中恢复的方法。
远离scanf()
的初学者指南是一本不错的读物,尽管我会提供更严格的建议:忘记scanf
的存在。
根据的要求
每一行都将是一个随机字母字符串,我的程序需要为每个字符串动态分配内存。这些字符串将是链表中结构的一部分。
POSIXgetline
(或getdelim
(是一个可靠的选择(如果可用(。此函数处理从文件中读取输入,并在请求时动态分配内存。
下面是一个示例骨架程序,其功能与您所描述的功能大致相似。
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
char *input(FILE *file) {
char *line = NULL;
size_t n;
if (-1 == getline(&line, &n, file))
return NULL;
return line;
}
size_t parse_header(char *header) {
return 42;
}
void use_data(char *data) {
free(data);
}
int main(void) {
char *header = input(stdin);
char *data;
if (!header)
return EXIT_FAILURE;
size_t lines_expected = parse_header(header);
size_t lines_read = 0;
free(header);
while ((data = input(stdin))) {
lines_read++;
use_data(data);
}
if (lines_read != lines_expected)
fprintf(stderr, "Mismatched lines.n");
}
如果您的系统上没有POSIX,或者您只是想探索其他选择,那么标准库提供的读取输入的更好方法之一是fgets
。结合malloc
、strlen
和strcpy
,您将大致实现getline
,但请注意提供的fgets
手册中的注意事项。
虽然scanf
对于读取和解析输入来说都是一个糟糕的选择,但sscanf
对于解析字符串仍然很有用,因为您可以更好地控制数据的状态。
strtol
/strtod
函数族通常比atoi
类型的函数更适合解析数字,尽管它们可能很难正确使用。