我有一个文件名ABCD_81018293.txt.我尝试sscanf获得ABCD作为文本和数字作为int



我尝试过的其中一种形式是

    char *text, ebuf[32];
    int *num;     
    strncpy (ebuf,tfp->d_name,strlen(tfp->d_name));
    sscanf (ebuf, "%s_%i.txt", text, num);

我最初使用tfp->d_name来代替ebuf hack,结果是相同的:段错误。我从手册页中了解到,也许%s应该是%4c(文本字符串有4个字符-但并不总是)。无论如何,%4c或4%c没有任何区别。

感谢所有回应的人。你的澄清——尤其是WhozCraig的"更好的手册页"——让我走上了正确的道路。

初始化问题不是我的主要问题,它是sscanf的语法。对于我的程序,一旦初始化完成,我真正需要的一行是:

      sscanf (tfp->d_name, "%[^_]_%i", &text[0], &num);

你的指针没有初始化,所以没有指向任何一致的对象。

您可以使用malloc为它们分配空间,例如:

char *text = malloc(max_len);
int *num = malloc(sizeof(int));
// ....
free(text);
free(num);

可以看到,malloc占用的内存必须是free占用才能释放分配的内存。

否则,您可以使用一个简单的变量和一个数组来存储您的c-string

char text[max_len];
int num;
// ...
sscanf (ebuf, "%s_%i.txt", text, &num);

看一下这个SO问题,了解如何触发'_'作为字符串分隔符。所以,正如BLUEPIXY对你的评论:

sscanf(ebuf, "%[^_]_%i.", text, &num);

最后,你可以避免strncpy,和sscanf直接到tfp->d_name

sscanf(tfp->d_name, "%[^_]_%i.", text, &num);

这也避免了sscanf由于没有null终止的ebuf字符串的"爆炸":您应该使用strlen(tfp->d_name)+1作为strncpy的第三个参数来复制到ebuf的null终止符。

正如strlen Man所说:

strlen()函数的作用是计算所指向字符串的长度by s, 不包括终止空字节('')

<>共舞,强调我的

最新更新