我怀疑我是否有这样的输入:
5 4
1 2 3 4 5
2 3 4
2 3
1 2 3
第一个数字表示不同的“玩具”,每个 child 都对应于第二个数字,即四,因此代表每个 child 和他们想要的玩具的行数......
我如何在 ansi C 中读取这样的输入?
使用strtok
?或者还有其他更简单的方法吗?
我可以用这样的东西来做
char line [250];
char * tok;
char *ptr = line;
while((scanf("%s",line)!= EOF){
while ((tok = strtok(ptr, " ")) != NULL)
{
pseudo part
//convert to int
//add to array
}
}
但是有没有更简单的方法可以在不使用 tok 的情况下进行此输入? 谢谢...
最佳答案
推荐一个经典的fgets()/sscanf()
组合。
一次读一行。良好的错误检查可用。使用 "%n"
知道下一个玩具的下一次扫描从哪里开始。
char buffer[250];
if (fgets(buffer, sizeof buffer, stdin) == NULL)
HandleEOF();
int toys, kids;
int cnt = sscanf(buffer, "%d%d", &toys, &kids);
if (cnt != 2 || toys <= 0 || kids <= 0)
Handle_BadToysKids(cnt);
int kid_wants[kids][toys] = { 0 };
for (int k = 0; k < kids; k++) {
if (fgets(buffer, sizeof buffer, stdin) == NULL)
HandleEOF();
char *p = buffer;
int want;
int n;
while ((cnt = sscanf(p, "%d %n", &want, &n)) == 1) {
if (want <= 0 || want > toys)
Handle_BadWant(want);
kid_wants[k][want - 1] = 1;
p += n;
}
}
改进:
使用 size_t toys, kids
和 "%zu"
。
使用哨兵检查线路上是否有多余的垃圾:
int ch; int cnt = sscanf(buffer, "%d%d %c", &toys, &kids, &ch);
检查 while
循环末尾的 *p
- 它应该是 '\0'
。
关于c - 从标准输入读取变量输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22467459/