使用sscanf从C ++中的字符串中提取int

时间:2015-11-23 04:46:55

标签: c++ c scanf

我的函数必须处理看起来像hello y(5)或data | 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无法在括号中找到整数的任何想法?谢谢!

4 个答案:

答案 0 :(得分:7)

  

为什么sscanf无法在括号中找到整数

"%d"中的sscanf(info.c_str(), "%d", address)会导致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

如果代码想要依赖"它总是在括号之间。" {strong}和之类的输入不会出现"abc()def(123)"之间的非数字数据。

()

或只是

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

答案 1 :(得分:1)

你可以使用像这样简单的东西,其中strchr找到第一次出现的“(”然后使用atoi返回将停在第一个非数字的整数。

  char s1[] = "hello y(5)";
  char s2[] = "data [x(3)]";
  char s3[] = "hello";

  int a1 = 0;
  int a2 = 0;
  int a3 = 0;

  char* tok = strchr( s1, '(');
  if (tok != NULL)
    a1 = atoi(tok+1);

  tok = strchr( s2, '(');
  if (tok != NULL)
    a2 = atoi(tok+1);

  tok = strchr(s3,'(');
  if (tok != NULL)
    a3 = atoi(tok+1);

  printf( "a1=%d, a2=%d, a3=%d", a1,a2,a3);

  return 0;

答案 2 :(得分:1)

  

当字符串包含整数时,它将始终位于中间   括号

要严格遵守此要求,您可以尝试:

StringBuilder

答案 3 :(得分:0)

  

link to a solution

int address;

sscanf(info.c_str(), "%*[^0-9]%d", &address);
printf("%d", address);

这应该在括号

之间提取整数