简体   繁体   English

使用 sscanf 解析 C 中的字符串

[英]Parse string in C with sscanf

The string I am trying to parse is called str1, and it contains PRETTY_NAME="Ubuntu 20.04.1 LTS"我要解析的字符串称为 str1,它包含PRETTY_NAME="Ubuntu 20.04.1 LTS"

The goal is to have one variable contain PRETTY_NAME , and the other contains Ubuntu 20.04.1 LTS .目标是让一个变量包含PRETTY_NAME ,另一个包含Ubuntu 20.04.1 LTS I have declared both variables as char *var1, *var2我已将两个变量声明为char *var1, *var2

This has to be done with the sscanf function in C.这必须使用 C 中的 sscanf function 来完成。

My current code looks like: sscanf(str1, "%s[^=]^s", var1. var2);我当前的代码如下所示: sscanf(str1, "%s[^=]^s", var1. var2); The output I am receiving is that both var1, and var2 return (null) .我收到的 output 是 var1 和 var2 都返回(null)

What am I doing wrong?我究竟做错了什么?

the %s matches the entire string terminates at white space or \0 including = in that case, you can't use that here, and you haven't initialized any of your char buffer with a size which leads to crash or undefined behavior. %s匹配整个字符串以空格或\0结尾,包括=在这种情况下,您不能在此处使用它,并且您尚未使用导致崩溃或未定义行为的大小初始化任何 char 缓冲区。 here is a simplified parser.这是一个简化的解析器。

void parse(const char* str, char* pretty, char* release) {
    int pretty_end, start, end;
    sscanf(str, "%*[^=]%n=\"%n%*[^\"]%n\"", &pretty_end, &start, &end);
    
    strncpy(pretty, str, pretty_end);
    pretty[pretty_end] = '\0';
    
    strncpy(release, str+start, end-start);
    release[end - start] = '\0';
}

int main() {

    const char* str = "PRETTY_NAME=\"Ubuntu 20.04.1 LTS\"";
    char pretty[256];
    char release[256];
    parse(str, pretty, release);

    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM