0

文字列が与えられた場合、それを調べて、その文字列内のすべての数値を整数変数に割り当て、他のすべての文字を除外するにはどうすればよいですか?

gets()入力が読み込まれたときではなく、すでに読み込まれた文字列がある場合にこのタスクを実行したいと思います。

4

4 に答える 4

3
unsigned int get_num(const char* s) {
  unsigned int value = 0;
  for (; *s; ++s) {
    if (isdigit(*s)) {
      value *= 10;
      value += (*s - '0');
   }
  }
  return value;
}

編集:これは関数のより安全なバージョンです。数値に変換できる場合、または変換できない場合sは0を返します。文字列が。より大きい値を表す場合NULLに返されます。UINT_MAXUINT_MAX

#include <limits.h>

unsigned int safe_get_num(const char* s) {
  unsigned int limit = UINT_MAX / 10;
  unsigned int value = 0;
  if (!s) {
    return 0;
  }
  for (; *s; ++s) {
    if (value < limit) {
      if (isdigit(*s)) {
        value *= 10;
        value += (*s - '0');
      }
    }
    else {
      return UINT_MAX;
    }
  }
  return value;
}
于 2010-03-06T12:49:02.080 に答える
3

これは、それを行うための単純なC++の方法です。

#include <iostream>
#include <sstream>
using namespace std;   

int main(int argc, char* argv[]) {

    istringstream is("string with 123 embedded 10 12 13 ints", istringstream::in);
    int a;

    while (1) {
        is >> a;
        while ( !is.eof() && (is.bad() || is.fail()) ) {
            is.clear();
            is.ignore(1);
            is >> a;
        }
        if (is.eof()) {
            break;
        }
        cout << "Extracted int: " << a << endl;
    }

}
于 2010-03-06T12:33:36.727 に答える
0

標準Cライブラリからstrtol関数を検索します。これにより、文字配列の数字である部分を見つけることができ、数字ではない最初の文字を指し、解析を停止します。

于 2010-03-06T12:18:53.810 に答える
0

次を使用できます:文字列(char配列)とsscanf同じように機能します。scanf

sscanfしかし、あなたが望むものにはやり過ぎかもしれないので、これを行うこともできます:

int getNum(char s[])
{
    int ret = 0;
    for ( int i = 0; s[i]; ++i )
        if ( s[i] >= '0' && s[i] <= '9' )
            ret = ret * 10 + (s[i] - '0');

    return ret;
}
于 2010-03-06T12:20:31.450 に答える