1

我正在尝试使用sscanf()循环读取字符串,但偏移量为零。什么是正确的方法,是否有可能跟踪偏移量?

在此处的示例中,offset应该是 5,但实际值为 0,我必须手动将其设置为 5。

char line[35]=" -123    1  -25-1245  -12";
char *data=line;
char buf[6];
int offset;
int n,i;

for(i=0;i<5;i++){
  if(sscanf(data,"%5[^\n\t]s%n",buf,&offset)==1){
    n=atoi(buf);
    data+=5;//offset;
  printf("n= %5d  offset= %d\n",n, offset);
  }
 }

结果是:

n=  -123  offset= 0
n=     1  offset= 0
n=   -25  offset= 0
n= -1245  offset= 0
n=   -12  offset= 0
4

2 回答 2

3

%[…]问题是 et al中的“扫描集”sscanf()是一个完整的转换规范,而不是%s. 您的数据中没有s字符,因此sscanf()无法匹配s格式字符串中的文字,因此无法设置offset,因为匹配失败。

使用更多的空白和更少s的 's:

char line[35] = " -123    1  -25-1245  -12";
char *data = line;
char buf[6];
int offset;
int n, i;

for (i = 0; i < 5; i++)
{
    if (sscanf(data, "%5[^\n\t]%n", buf, &offset) == 1)
    {
        n = atoi(buf);
        data += offset;
        printf("n = %5d; offset = %d\n", n, offset);
    }
}

您的问题已经表明您知道如何sscanf()在循环中使用中讨论的大部分内容?

于 2019-09-04T14:05:01.240 回答
2

's'您的转换规范字符串中间有一个错位的文字sscanf,它可能不匹配,sscanf甚至在到达%n. 去掉它。

于 2019-09-04T14:03:05.460 回答