我正在尝试使用.txt
删除文件的扩展名(我知道它是sscanf()
)。我尝试过很多格式字符串,我认为可能有用,但没有成功。主要的问题是我无法理解sscanf()
的文档,所以我不知道如何使用这个[=%[*][width][modifiers]type=]
我试图告诉它最终必须是“.txt”或者将变量中的初始字符串和另一个变量中的扩展名%4c
保存在一起,但是再次......无法使其正常工作。
我知道此前有人问过:sscanf: get first and last token in a string但正如我所说的......我不理解它的解决方案。
我的代码中的一部分:
sscanf(fileName,"the_sender_is_%s%*[.txt]", sender);
输入文件名例如是:“the_sender_is_Monika.txt”
在sender
我应该
Monika
但无论我尝试什么都给了我
Monika.txt
答案 0 :(得分:2)
虽然sscanf()
功能强大,但它不是通用工具。你可以用它做什么是有限制的,而你正在击中它们。对任务的适度近似将是:
char body[32];
char tail[5];
if (sscanf("longish-name-without-dots.txt", "%31[^.]%4s", body, tail) != 2)
…oops — can't happen with the constant string, but maybe with a variable one…
这会让您longish-name-without-dots
进入body
而.txt
进入tail
。但如果在扩展名之前名称部分中有点,那么它将无法正常工作。
你可能正在寻找:
const char *file = "longish-name.with.dots-before.txt";
char *dot = strrchr(file, '.');
if (dot == NULL)
…oops — can't happen with the literal, but maybe with a variable…
strcpy(tail, dot); // Beware buffer overflow
memcpy(body, file, dot - file);
body[dot - file] = '\0';
答案 1 :(得分:1)
使用时
sscanf(fileName,"the_sender_is_%s%*[.txt]", sender);
该函数在处理%s
之前尽可能多地使用%*[.txt]
进行读取。
使用
sscanf(fileName,"the_sender_is_%[^.]", sender);