我正在努力寻找获得此类输入的最佳方式: “Word1 word2 1 2 3 4 -1” 基本上我想在字符串中保存“This is a string”并将数字添加到变量sum中,直到它们达到-1。
我试过
scanf("%s %s", &string1, &string2);
它无法正常工作。
答案 0 :(得分:0)
#include <stdio.h>
int main(void)
{
char line[4096];
while (fgets(line, sizeof(line), stdin) != 0)
{
char name1[32];
char name2[32];
int score = 0;
int offset = 0;
int length = 0;
int number;
if (sscanf(line + length, "%s%n", name1, &offset) != 1)
break;
length += offset;
if (sscanf(line + length, "%s%n", name2, &offset) != 1)
break;
length += offset;
while (sscanf(line + length, "%d%n", &number, &offset) == 1 && number != -1)
{
length += offset;
score += number;
}
printf("%s %s %d\n", name1, name2, score);
}
return 0;
}
数据文件:
John Smith 1 2 4 5
John Sutton 2 4 6 8 9 -1
Maggie Smith 9 8 9 8 9 9 -1
示例输出:
John Smith 12
John Sutton 29
Maggie Smith 52
如果最后没有-1,你可以将它修复为对象(虽然它确实不需要,见证第一行输入),同样如果有超过6个条目,你可以对象,等
或者,如果您想使用fscanf()
,那么您可以这样做(它为给定输入提供与原始版本相同的输出):
#include <stdio.h>
int main(void)
{
char name1[32];
char name2[32];
int score[7];
int nv;
while ((nv = fscanf(stdin, "%31s %31s %d %d %d %d %d %d %d",
name1, name2, &score[0], &score[1], &score[2], &score[3],
&score[4], &score[5], &score[6])) > 2)
{
int total = 0;
for (int i = 0; i < nv - 2; i++)
{
if (score[i] == -1)
break;
total += score[i];
}
printf("%s %s %d\n", name1, name2, total);
}
return 0;
}
请注意,此代码知道已成功读取的数量(nv - 2
),并相应地进行。现在你的任务是搞乱数据文件以查看它接受的其他格式,然后决定这是否更好。您还可以使用混合程序,使用fgets()
读取一行和sscanf()
类似于第二个程序中的fscanf()
,以便一次读取所有值。