C - scanf 仅在特定字符序列后提取引号中的数字

标签 c scanf stdio

假设我有一个像这样的字符串:

Hello World - this is a line of textCOLOR="4"

这个字符串存储在buf[1000]

正如您所看到的,该字符串有一个格式为 COLOR="n" 的颜色标签。该数字是需要提取的数字(可以在 1 到 56 之间)并分配给 int 变量。我希望这个标签能够位于字符串中的任何位置。

我可以运行以下代码来提取颜色值:

int colorNumber = 1; //default value
if (scanf(buf, "%*[^\"]\"%2d[^\"]\"", &colorNumber)) {
    // work with number
}

这工作正常,但如果字符串中包含数字或引号,那么 scanf 将无法生成数字。

我尝试了第二个 scanf 参数的一些变体,但这些都不起作用。我尝试了 "%*[^\"]COLOR=\"%2d[^\"]\"" 但这似乎根本不起作用。

我浏览了 scanf 的手册页,但也找不到我要查找的内容。

也许 scanf 不是合适的工具?如果有必要,我愿意尝试其他库/函数。

最佳答案

尝试

if (sscanf(buf, "%*[^C]COLOR=\"%d", &colorNUM) == 1)

您尝试的原因 "%*[^\"]COLOR" ...格式不起作用是 %*[\"]匹配 " 之前的所有内容,跳过颜色,因此将无法匹配颜色。如果还有另一个C,上面的操作将会失败COLOR 之前字符串中的其他位置, 然而。为了避免这种情况,您最好使用 strstr ,可能在循环中 if COLOR可能会出现在多个地方。

for (const char *p = buf; p = strstr(p, "COLOR"); ++p) {
    if (sscanf(p, "COLOR=\"%d", &colorNum) == 1) {
        // found a color number

另请注意,尝试匹配 %d 之后的字符不管匹配与否是没有意义的,返回的值都是一样的,所以没有办法判断。如果你想确保有一个 "在数字之后,您需要类似的内容

int end = 0;
if (sscanf(p, "COLOR=\"%d\"%n", &colorNum, &end), end > 0)

通过检查%n写了一些东西给end ,您还要检查 %n 之前的所有内容匹配正确。

关于C - scanf 仅在特定字符序列后提取引号中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58780480/

相关文章:

c - C 循环中的数组值(clang vs gcc)

c - 程序在 `scanf` 函数中崩溃。为什么?

c - scanf 正则表达式 - C

reactjs - Elixir/Erlang : How to find the source of high CPU usage?

c - C : does GCC follow the C99 spec, 中的链接还是我不了解规范?

c - 合并排序未显示正确的输出

c - 为什么这会在一个系统上给我带来段错误,而在另一个系统上却不会?

c - scanf 读取上一行而不是获取新行

c++ - #include stdio 混淆 是否每个头文件都需要?

c - ungetc:回推的字节数