我在阅读和使用strtok功能拆分多行用户输入时遇到麻烦。我需要按它们之间的空格进行拆分,但是我认为strtok会继续添加额外的一行?
例如:
用户将粘贴以下文本块:
324 A 1 D F
829 Z 3 3 F G
1234 C 3 F G
234 D 2 3
当我打印令牌的输出时,它向我显示:
324 A 1 D F
829 Z 3 3 F G
1234 C 3 F G
<---按下Enter键后生成随机新行--->
234 D 2 3。 <-仅在随机线生成后显示。
将第1行到第3行粘贴到控制台后,立即将其打印到控制台中。 按下回车键后,将在它们之间插入新行,最后打印最后一行。然后我必须再次按Enter键才能结束程序。
这是我的代码:
int main(void) {
char input[256];
int done = 1;
while (done!=0){
fgets(input,256,stdin);
char* t;
printf("\n");
t=strtok(input, " \n");
if (*t == '\n'){
done = 0;
} else{
while (t!= NULL){
printf("%s " ,t);
t = strtok(NULL, " \n");
}
}
}
}
答案 0 :(得分:1)
IO操作的第一条规则:从不假定它们成功。
fgets
的未经检查的结果。 strok
停(终止于)空格或换行符,则您如何期望*t
指向换行符。因此done = 0;
将永远不会命中。因此,您跳入了您从未检查过的失败的fgets
通话中,等等。代码
#include <stdio.h>
#include <string.h>
int main()
{
char input[256];
// check for failure to read, on a line with newline first
while (fgets(input, 256, stdin) != NULL && *input != '\n')
{
char *t = strtok(input, " \n");
while (t != NULL)
{
printf("%s ", t);
t = strtok(NULL, " \n");
}
fputc('\n', stdout);
}
}
输入
324 A 1 D F
829 Z 3 3 F G
1234 C 3 F G
234 D 2 3
输出
324 A 1 D F
829 Z 3 3 F G
1234 C 3 F G
234 D 2 3