gpt4 book ai didi

c++ - 在 C++ 中使用 sscanf 从字符串中提取一个 int

转载 作者:可可西里 更新时间:2023-11-01 18:26:18 32 4
gpt4 key购买 nike

我的函数必须处理看起来像 say hello y(5) 或数据 |x(3)| 的字符串,我需要能够提取显示的整数并将其存储到一个名为 address 的单独 int 变量中。然而,一些通过的字符串将没有任何整数,对于这些字符串,地址必须默认为 0。当字符串包含整数时,它总是在括号之间。我曾尝试使用 sscanf,但是,作为 sscanf 的新手,我遇到了问题。出于某种原因,地址始终显示为 0。这是我的代码:

void process(string info)
{
int address = 0; // set to 0 in case info contains no digits
sscanf(info.c_str(), "%d", address);
.
.
.
// remainder of code makes other function calls using the address, etc
}

关于为什么 sscanf 无法找到括号之间的整数的任何想法?谢谢!

最佳答案

why the sscanf fails to find the integer in between parentheses

sscanf(info.c_str(), "%d", address)中的"%d"会导致sscanf()一旦检测到非数字序列就停止扫描。像 "(5)" 这样的文本将简单地在 "(" 处停止扫描。

相反,代码需要跳过非数字文本。


伪代码

  in a loop
search for any of "-+0123456789"
if not found return 0
convert from that point using sscanf() or strtol()
if that succeeds, return number
else advance to next character

示例代码

int address;
const char *p = info.c_str();
for (;;) {
p += strcspn(p, "0123456789+-");
if (*p == 0) return 0;
if (sscanf(p, "%d", &address) == 1) {
return address;
}
p++;
}

注意事项:

strcspn 函数计算 s1 指向的字符串的最大初始段的长度,该字符串完全由不是来自 指向的字符串的字符组成s2。 C11 7.24.5.3 2


如果代码要依赖“它总是在括号之间。” "abc()def(123)"这样的输入不会出现,它在()之间有前面的非数字数据。:

const char *p = info.c_str();
int address;
if (sscanf(p, "%*[^(](%d", &address)==1) {
return address;
}
return 0;

或者只是

int address = 0;
sscanf(info.c_str(), "%*[^(](%d", &address);
return address;

关于c++ - 在 C++ 中使用 sscanf 从字符串中提取一个 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33863872/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com