sscanf获取剩余字符串的值

sscanf获取剩余字符串的值,c,arrays,string,char,scanf,C,Arrays,String,Char,Scanf,我有一个字符串,看起来像这样: "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

我有一个字符串,看起来像这样:

"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的方法呢?

您可以对整个
无符号字符类型使用scanset:

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

另外,您应该始终检查
sscanf
中的返回值。如果数字后只有空格,第三个说明符将不匹配任何内容,
sscanf
将返回
2
,而
响应保持不变。

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

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

现在,您已经通过使用
%s%d%[^\0]“
达到了目标,您现在的问题是什么?没有达到我的目标,响应没有所需的值。响应应该是“Now some random text\n Now more text\t\t”,在我的计算机上没有HELLO和状态代码,
Response
正好是“Now some random text\n Now more text\t\t”在我的GCC 5.3计算机上没有。0@sunqingyao这似乎令人费解,但一旦你想一想,就会明白了
sscanf
读取格式字符串(第一个参数),直到出现NUL终止符(
'\0'
)。在
%s%d%[^\0]“
的情况下,字符串中嵌入了一个
\0
。这就解释了第二个警告<因此,code>sscanf
只能看到
%s%d%[^”
。现在您将了解第一个警告。我不知道该字符串是否调用未定义的行为。因此,与此相关。