我需要用fgets分析字符串以前的读者,
然后我有一行:
name age steps\n
mario 10 1 2 3 4\n
joe 15 3 5\n
max 20 9 3 2 4 5\n
每列有不同数量的步骤, 然后我可以用
来读取姓名和年龄 sscanf(mystring, "%s %d", name, &age);
之后我有一个for循环阅读所有步骤
int step[20];
int index=0;
while(sscanf(mystring,"%d", &step[index++])>0);
但是这个循环永远不会用年龄列填充所有数组数据。
答案 0 :(得分:2)
在sokkyoku的回答中给出了一个有效的解决方案。
读取可变长度行的另一种可能性是使用strtok,如下面的代码片段所示:
int getlines (FILE *fin)
{
int nlines = 0;
int count = 0;
char line[BUFFSIZE]={0};
char *p;
if(NULL == fgets(buff, BUFFSIZE, fin))
return -1;
while(fgets(line, BUFFSIZE, fin) != NULL) {
//Remove the '\n' or '\r' character
line[strcspn(line, "\r\n")] = 0;
count = 0;
printf("line[%d] = %s\n", nlines, line);
for(p = line; (p = strtok(p, " \t")) != NULL; p = NULL) {
printf("%s ", p);
++count;
}
printf("\n\n");
++nlines;
}
return nlines;
}
上述函数getlines
的解释:
文件fin
中的每一行都使用fgets
读取并存储在变量line
中。
然后通过函数line
提取\t
中的每个子字符串(由空格或p
字符分隔)并将指向该子字符串的指针存储在strtok
中for循环(例如,请参阅此post以获取有关strtok的更多示例)。
然后该函数只打印p
,但您可以在此处使用子字符串执行所有操作。
我还计算(++count
)每行中找到的项目数。最后,函数getline
计算并返回读取的行数。
答案 1 :(得分:2)
这永远不会结束的原因是因为你不断提供相同的字符串进行扫描。
sscanf
提供了%n
开关,用于存储在a内到达之前读取的字符数量,这允许您在重新扫描之前在输入字符串中向前移动该字符数量。
这个工作:
int step[20];
int index=0;
int readLen;
while(sscanf(mystring,"%d%n", &step[index++], &readLen)>0) {
mystring += readLen;
}