文字列が与えられた場合、それを調べて、その文字列内のすべての数値を整数変数に割り当て、他のすべての文字を除外するにはどうすればよいですか?
gets()
入力が読み込まれたときではなく、すでに読み込まれた文字列がある場合にこのタスクを実行したいと思います。
文字列が与えられた場合、それを調べて、その文字列内のすべての数値を整数変数に割り当て、他のすべての文字を除外するにはどうすればよいですか?
gets()
入力が読み込まれたときではなく、すでに読み込まれた文字列がある場合にこのタスクを実行したいと思います。
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_MAX
UINT_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;
}
これは、それを行うための単純な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;
}
}
標準Cライブラリからstrtol
関数を検索します。これにより、文字配列の数字である部分を見つけることができ、数字ではない最初の文字を指し、解析を停止します。
次を使用できます:文字列(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;
}