【问题标题】:sscanf get the value of the remaining stringsscanf 获取剩余字符串的值
【发布时间】:2016-05-08 05:16:27
【问题描述】:

我有一个如下所示的字符串:

"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"

有没有办法不用strtok?

【问题讨论】:

  • 现在您已经通过使用"%s %d %[^\0]" 实现了目标,您现在有什么问题?
  • 没有达到我的目标,响应没有期望的值。响应应该是“现在一些随机文本\n 现在更多文本\t\t”,没有 HELLO 和状态码
  • 在我的电脑上,response 正好是“No some random text\n now more text\t\t”
  • 不在我的 GCC 5.3.0 机器上
  • @sunqingyao 这可能看起来很令人费解,但仔细想想就会明白。 sscanf 读取格式字符串(第一个参数),直到出现 NUL 终止符 ('\0')。对于"%s %d %[^\0]",字符串中嵌入了\0。这解释了第二个警告。 sscanf 因此只能看到 "%s %d %[^"。现在您将了解第一个警告。我不知道该字符串是否会调用未定义的行为。所以,I've asked a question 与此相关。

标签: c arrays string char scanf


【解决方案1】:

您可以对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 保持不变。

【讨论】:

    【解决方案2】:

    %n 说明符将捕获扫描中使用的字符数。这应该获取用于扫描第一个值的字符数,然后从该索引获取 strcpy。

    int used;
    sscanf (str, "%s %d %n", message, &status, &used);
    strcpy ( response, &str[used]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2016-05-10
      • 1970-01-01
      • 2013-06-29
      相关资源
      最近更新 更多