19

のような文字列がab234cid*(s349*(20kdあり、すべての数字を抽出したいと234, 349, 20します。どうすればよいですか?

4

7 に答える 7

34

strtol次のように、で実行できます。

char *str = "ab234cid*(s349*(20kd", *p = str;
while (*p) { // While there are more characters to process...
    if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) )) {
        // Found a number
        long val = strtol(p, &p, 10); // Read number
        printf("%ld\n", val); // and print it.
    } else {
        // Otherwise, move on to the next character.
        p++;
    }
}

ideoneへのリンク。

于 2012-11-15T14:34:58.987 に答える
16

sscanf()セットとスキャンセットを使用した可能な解決策:

const char* s = "ab234cid*(s349*(20kd";
int i1, i2, i3;
if (3 == sscanf(s,
                "%*[^0123456789]%d%*[^0123456789]%d%*[^0123456789]%d",
                &i1,
                &i2,
                &i3))
{
    printf("%d %d %d\n", i1, i2, i3);
}

ここで%*[^0123456789]、は数字が見つかるまで入力を無視することを意味します。http://ideone.com/2hB4UWのデモを参照してください。

または、数値の数が不明な場合は、%n指定子を使用して、バッファーで読み取られた最後の位置を記録できます。

const char* s = "ab234cid*(s349*(20kd";
int total_n = 0;
int n;
int i;
while (1 == sscanf(s + total_n, "%*[^0123456789]%d%n", &i, &n))
{
    total_n += n;
    printf("%d\n", i);
}
于 2012-11-15T14:41:47.207 に答える
3

ここで使用する簡単な解決策の後sscanf

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char str[256]="ab234cid*(s349*(20kd";
char tmp[256];

int main()
{

    int x;
    tmp[0]='\0';
    while (sscanf(str,"%[^0123456789]%s",tmp,str)>1||sscanf(str,"%d%s",&x,str))
    {
        if (tmp[0]=='\0')
        {
            printf("%d\r\n",x);
        }
        tmp[0]='\0';

    }
}
于 2012-11-15T15:37:50.380 に答える
2

1 つの基本原則に基づいて動作するステート マシンを作成します。現在の文字は数字です。

  • 数字以外から数字に移行するときは、 current_number := number を初期化します。
  • 桁から桁に移行するときは、新しい桁を次のように「シフト」します。
    current_number := current_number * 10 + number;
  • 数字から数字以外に移行するときは、 current_number を出力します
  • 非数字から非数字になると、何もしません。

最適化が可能です。

于 2012-11-15T14:37:51.000 に答える
1

文字列内の数字が空白で区切られている場合は、sscanf() を使用できます。あなたの例には当てはまらないので、自分でやらなければなりません:

char tmp[256];

for(i=0;str[i];i++)
{
  j=0;
  while(str[i]>='0' && str[i]<='9')
  {
     tmp[j]=str[i];
     i++;
     j++;
  }
  tmp[j]=0;
  printf("%ld", strtol(tmp, &tmp, 10));
  // Or store in an integer array

}

于 2012-11-15T14:37:14.870 に答える
1
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
void main(int argc,char *argv[])
{
char *str ="ab234cid*(s349*(20kd", *ptr = str;
while (*ptr) { // While there are more characters to process...
    if ( isdigit(*ptr) ) {
        // Found a number
        int val = (int)strtol(ptr,&ptr, 10); // Read number
        printf("%d\n", val); // and print it.
    } else {
        // Otherwise, move on to the next character.
        ptr++;
    }
}

}
于 2018-11-30T12:11:36.513 に答える