gpt4 book ai didi

c - 从标准输入读取变量输入

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:45 27 4
gpt4 key购买 nike

我怀疑我是否有这样的输入:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com