我尝试过的其中一种形式是
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, 不包括终止空字节(' ')。
<>共舞,强调我的