簡體   English   中英

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

[英]Using sscanf to extract an int from a string in C++

我的函數必須處理看起來像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無法在括號之間找到整數的任何想法? 謝謝!

為什么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


如果代碼想要依賴“它將永遠在括號之間”。 "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;

你可以使用像這樣簡單的東西,其中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;

當字符串包含整數時,它將始終位於括號之間

要嚴格遵守此要求,您可以嘗試:

void process(string info)
{
    int address;
    char c = '5'; //any value other than ) should work

    sscanf(info.c_str(), "%*[^(](%d%c", &address, &c);
    if(c != ')') address = 0;
    .
    .
    .
}

鏈接到解決方案

int address;

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

這應該在括號之間提取整數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM