sscanf获取由两个固定字符串包围的字符串段

时间:2014-06-06 05:18:44

标签: c scanf

我正在尝试使用.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

2 个答案:

答案 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);