2016-03-27 11 views
2

文字列をさまざまな整数に変換するにはどうすればよいですか?たとえば:char *を文字列に変換するには?

char *ray = {'2','1','F',' ','2','3'}; //numbers can be any length 
私はにそのライン上で変換することができますどのよう

int num = 21; 
int num2 = 23; 

答えて

0

は、あなたの区切り文字として任意の数字以外の文字があるとします。そして、あなたは、私が「線」に文字列全体の入力を取っています、ここでは、このOUT->

#include <stdio.h> 
#include<string.h> 
#define MAX 100 

int main() { 
    int a,flag=0,len,num_count=0,limit; 
    char ray[MAX]; 
    fgets(ray,MAX-1,stdin); 
    len=strlen(ray); 
    int *numbers=(int*)calloc(sizeof(int),((len/2)+1)); 
    for(a=0;a<len;a++){ 
     if(ray[a]>='0' && ray[a]<='9'){ 
      flag=1; 
      numbers[num_count]=(numbers[num_count]*10)+ray[a]-'0'; 
     } 
     else{ 
      if(flag!=0){ 
       flag=0; 
       num_count++; 
      } 
     } 
    } 
    limit=(flag==0)?num_count:num_count+1; 
    for(a=0;a<limit;a++) 
     printf("%d\n",numbers[a]); 
    free(numbers); 
    return 0; 
} 
  • を試すことができます(入力が「344hの54j5k45jn」のようにすることができます)。
  • その形式の文字列の場合、最大の天井(ray.length())番号を持つことができます。したがって、そのサイズの整数配列を作成します。
  • 文字列を繰り返し処理すると、連続した数字のブロックが見つかると整数配列に格納されますが、区切り文字を見つけたら処理しません。
  • 次に、整数配列を出力します。

ロジックについてさらに明確化が必要な場合は、教えてください。

+0

なぜ 'fgets'の複雑さを追加するのですか?おそらくOPはまだI/Oについて知りません。 –

+1

バッファオーバーフローの問題が発生しやすいので、私は基本的に、廃止されたgets()の代わりにfgets()を使用しました。 – RwitamB

+0

いいえ、私は単純になぜファイルから読み込むのかを意味していましたか? OPはそうしていないし、まだI/Oについて知りません。 –

3

文字列をさまざまな整数に変換するにはどうすればよいですか?

C文字列から整数を抽出する方法はいくつかあります。最初の2つは、sscanf()関数と、さまざまな文字列から整数への変換関数(strtol()など)です。まず第一に、しかし、あなたは実際の文字列持っている必要があります。

char ray[] = "21F 23"; /* terminator is implicit */ 

char ray[] = {'2','1','F',' ','2','3', '\0' }; /* note the terminator */ 

またはこのことは、前に100%相当です。これも動作します...

char *ray = "21F 23"; /* terminator is implicit */ 

...同じではありませんが...。 例宣言は、終端されていないため、文字列ではありません。さらに、ポインタと宣言された変数の配列初期化子を提供します。ポインタと配列は密接に関連していますが、それらは非常に異なるものです。 rayのため、これらの宣言のいずれかを考える

は、あなたがして

int num; 
int num2; 
int result = sscanf(ray, "%d%*[^0-9-]%d", &num1, &num2); 

を行う可能性がありますsscanf()機能はscanf()のようですが、それは、文字列からではなく、標準入力からスキャンします。私は、あなたがオプションで符号付き10進整数をスキャンするためのフィールド記述子である%dをよく知っていると思います。 2つの%d記述子の間のビットは、スキャンされているが、任意の変数(*)に割り当てられていないフィールドを記述し、小数点またはハイフン/マイナス記号ではない1つ以上の文字のシーケンスで構成されています。明らかに、scanfベースのソリューションでは、文字列の中で期待される数字の数(この場合は2)を知っていることを前提としています。

文字列に含まれる数字の数が不明な場合は、おそらくstrtol()の周りにソリューションを構築する方が簡単でしょう。この関数は、文字列のの最初の部分を整数に変換しようとし、成功した場合、変換された部分に続く文字列の末尾へのポインタを返します。これを使って文字列を歩き、行くごとに見つけた番号を変換することができます。

+0

OPの例ヌルで終了する文字列と、 'sscanf'や' strtol'のようなものにどのような影響を与えるかは使用しません。 –

+0

@CareyGregory、はい、それは私が私の答えの最初の部分を費やしたものです。私はそれをより明確にするために、私のコメントのその部分を広げました。 –

関連する問題