sscanf获取剩余字符串的值

6

我有一个类似于这样的字符串:

"HELLO 200 Now some random text\n now more text\t\t"

我尝试获取“HELLO”、“200”和剩余的字符串。不幸的是,该字符串可能包含“\n”和“\t”,因此我无法使用“%[^\n\t]”。
我尝试了以下方法:
char message[MESSAGE_SIZE], response[RESPONSE_SIZE];
int status;
sscanf (str, "%s %d %[^\0]", message, &status, response);

然后变量被

message = "HELLO", status = 200, response = "HELLO 200 Now some random text\n now more text\t\t"

但是响应字符串中包含 HELLO 200(不应该有这个)。是否有一种直接使用 scanf 而不需要使用 strtok 的方法来实现这一点?


既然你已经通过使用 "%s %d %[^\0]" 达到了你的目标,那么你现在有什么问题? - nalzok
1
没有达到我的目标,响应没有期望的值。响应应该是“一些随机文本\n现在更多的文本\t\t”,不包括“HELLO”和状态码。 - plainerman
在我的电脑上,“response”恰好是“一些随机文本\n现在更多的文本\t\t”。 - nalzok
不是在我的机器上,我使用的是GCC 5.3.0。 - plainerman
我正在使用带有GCC 4.7.1的code::blocks。有两个警告:main.c|11|warning: no closing ']' for '%[' format [-Wformat]|main.c|11|warning: embedded '\0' in format [-Wformat-contains-nul]|。第一个似乎很有趣。 - nalzok
1
@sunqingyao 这可能看起来令人困惑,但一旦你思考一下,就会有意义了。sscanf读取格式字符串(第一个参数),直到NUL终止符('\0')。在"%s %d %[^\0]"的情况下,字符串中嵌入了\0。这解释了第二个警告。因此,sscanf只看到"%s %d %[^"。现在你会理解第一个警告。我不知道该字符串是否会引发未定义行为。所以,我已经提出了一个问题与此相关。 - Spikatrix
2个回答

7
%n 格式符会捕获扫描时使用的字符数。应该获取用于扫描第一个值所使用的字符数,然后从该索引复制(使用 strcpy 函数)。
int used;
sscanf (str, "%s %d %n", message, &status, &used);
strcpy ( response, &str[used]);

6

您可以使用scanset来处理整个unsigned char类型的范围:

char message[MESSAGE_SIZE], response[RESPONSE_SIZE];
int status;
*response = '\0';
sscanf(str, "%s %d %[\001-\377]", message, &status, response);

此外,您应始终检查从sscanf的返回值。如果数字后面只有空白,则第三个指示符将不匹配任何内容,sscanf将返回2,并保持response不变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接