奇怪的sscanf行为

奇怪的sscanf行为,c,C,我正在尝试遍历字符串,并用制表符分隔单词 if(argc == 1) { while (argc == 1) { scanf("%s", ent); printf("<tr>"); while (sscanf(ent, "%[^\t]%n", piece, &n) == 1 ) { printf("<td>%s</td>", piece);

我正在尝试遍历字符串,并用制表符分隔单词

if(argc == 1) {
    while (argc == 1) {
        scanf("%s", ent);
        printf("<tr>");
        while (sscanf(ent, "%[^\t]%n", piece, &n) == 1 ) {           
            printf("<td>%s</td>", piece);
            ent += n;
        }
        printf("</tr>");
    }
}
if(argc==1){
while(argc==1){
scanf(“%s”,ent);
printf(“”);
而(sscanf(ent,“%[^\t]%n”,片段,&n)=1{
printf(“%s”,件);
ent+=n;
}
printf(“”);
}
}
当我运行此代码而不是
abc
我得到了abc 当我给stdin一个\tb\tc\n 这意味着在内部while循环结束且外部循环运行一次后,位置会发生移动。内部while循环不应该遍历所有字符串吗?我只能使用sscanfstrtol作为字符串遍历分隔符。

如果您试图标记字符串,请使用而不是:

char *piece = strtok(ent, "\t");
while (piece)
{
    printf("<td>%s</td>", piece);
    piece = strtok(NULL, "\t");
}
char*piece=strtok(ent,“\t”);
while(件)
{
printf(“%s”,件);
工件=strtok(空,“\t”);
}

您可能也应该使用而不是来获取字符串输入。

scanf(“%s”
读取以空格分隔的字符串——因此在您的示例中,第一个调用读取字符串
a
(当它看到选项卡时停止--whitespace)。如果您要读取整行(空格和all),改用
fgets

这是因为您没有跳过选项卡。
%[^\t]%n
将跨越所有非选项卡字符并对其进行计数,然后
ent+=n
将跳过这些字符,然后在选项卡处重新启动

忽略前导空格更容易(对于html来说,这根本不是一件坏事):

while(sscanf(ent,“%[^\t]%n”,片段,&n)==1)
//^跳过空格
printf(“%s”,件);
ent+=n;
}
或者如果出于某种原因,您必须有一个单独的终止选项卡

while (sscanf(ent,"[^\t]%n", piece, &n) ==1) {
        printf("<td>%s</td>",piece);
        ent+=n;
        if (*ent) ++ent;
}
while(sscanf(ent,[^\t]%n“,片段,&n)==1){
printf(“%s”,件);
ent+=n;
如果(*ent)+ent;
}
如果周围没有吹毛求疵的学究,这是很有用的:

int scanned=0;
while ( sscanf( ent+=scanned,"%[^\t]%n%*c%n", piece, &scanned, &scanned) > 0 )
        printf("<td>%s</td>",piece);
int扫描=0;
而(sscanf(ent+=扫描,“%[^\t]%n%*c%n”,片段、扫描和扫描)>0)
printf(“%s”,件);

不要听那些不喜欢
%n
的人的话,他们只是
%n
说话者:-)

而(argc==1)
。。。为什么?这是一个无限循环。它是需求的一部分,在printf之后它将始终循环回scanf,直到您ctrl^C第一个if是冗余的,
而(argc==1)
已经首先进行了比较。如果我使用strok,选项卡将被视为单个选项卡,这是我不想要的。我真的很想使用sscanf:)然后使用,它可以处理这种情况
scanf
绝对不是适合这项工作的工具。
int scanned=0;
while ( sscanf( ent+=scanned,"%[^\t]%n%*c%n", piece, &scanned, &scanned) > 0 )
        printf("<td>%s</td>",piece);