2017-01-17 5 views
0

ユーザがコンソールに入力する文字列から整数を取得する必要があります。scanfで文字列を解析する

例: 私はこの文字列を持っています:[1, 2, 3, 4, 5]と私はそれからすべての整数を取得したいと思います。私は既にscanf("%*[^\[]%d,", &a)のような複数のscanfパターンを試しましたが、何も動作しませんでした。スタックオーバーフローに関連するものは見つかりませんでした。

主な問題は、文字列に1〜50の整数を入力できることです。私はどのように整数だけをストックするかについては考えていません( '、'、 '' '' 'を取り除いて)配列に入れてください。

いくつかのソリューションは、このような

EDIT ... []または、 しかし、今、私はまだコマスと整数の間のスペースを削除する必要があるなどの特殊文字を除去するために発見されている:問題はfgetsのを使って解きます。私はscanfを使用して文字列を取得していましたが、SPACESには停止していました。 scanf関数であることを行うにはどのように

フォンドアウト:

しばらく(scanf関数( "%d個"、& i))を

+1

あなたは、このリンクを見たことがありますか? http://stackoverflow.com/questions/9210528/split-string-with-delimiters-in-c – Marievi

+1

私は質問が不明で、本質的にコードが表示されていない作業を受けるのを助けてくれるように頼んでいるので、議論を終えることにしました。 'scanf()'は文字列からの読み込みには使用されないので、 "パターン"は機能しません。 'sscanf()'は、その目的のために使われるかもしれません。 – Peter

+0

アドバイス: 'scanf'や友達と解析しないでください。 'scanf'は、入力があらかじめ決められている場合にのみ使用できます。 –

答えて

1

はあなたの文字列の中の不要な文字のすべての種類を分離することができstrtokを使用することにより、コードのこの部分を試してみてください。このs配列にあなたの不要な文字セットをすべて追加し、strtokに作業をさせてください。

char str[]="[1,2,3,4,5]"; 
const char s[4] = "[],"; // All unwanted characters to be filtered out 
char *token; 
token = strtok(str, s); 
while(token != NULL) 
{ 
    printf("%d\n", atoi(token)); 
    token = strtok(NULL, s); 
} 

これは整数形式なので、配列に格納してさらに進めることができます。

出力:

1 
2 
3 
4 
5 
+0

これはとてもうまくいっています!しかし、私はまだ少し問題があります:文字列にスペースを入れる必要があります(例:[1、2、3] – Nofix

+0

私は8進数コード '\ 040'をconst char [5] = "[]"に追加しようとしましたが、 \ 040 '";しかし、GCCは私がしたいことを理解していないようです。 – Nofix

+0

@Nofix文字列にスペースがあっても、トークン処理はうまくいきます。これをチェックしてください。コードは整数だけを出力するだけで正常に動作します。https://ideone.com/edSfup –

1

scanf/sscanfは正規表現をサポートしていません。あなたのような何かを試してみてください:

const char my_string[] = "[1,2,3,4,5]"; 
int a,b,c,d,e; 
sscanf(my_string, "[%d,%d,%d,%d,%d]", &a, &b, &c, &d, &e); 

例:http://ideone.com/AOaD7x

またscanf/sscanfの戻り値をチェックするために良いことができます:

int retval = sscanf(my_string, "[%d,%d,%d,%d,%d]", &a, &b, &c, &d, &e); 
if (retval != 5) 
    fprintf(stderr, "could not parse all integers\n"); 

Reference

編集: あなたのメールであなたが整数の可変数がある場合、これを行う方法を尋ねます。 strchrを使用すると、文字列内の次のカンマを検索し、コンマが見つからなくなるまで繰り返し続けます。これは、文字列が]で終わることを前提としています。

const char my_string[] = "[1,2,3,4,5]"; 

/* start at first integer */ 
const char *curr = &my_string[1]; 

while (curr != NULL) { 
    /* scan and print the integer at curr */ 
    int tmp; 
    sscanf(curr, "%d", &tmp); 
    printf("%d\n", tmp); 

    /* find next comma */ 
    curr = strchr(curr, ','); 

    /* if a comma was found, go to next integer */ 
    if (curr) 
     /* warning: this assumes that the string ends with ']' */ 
     curr += 1; 
} 

例:http://ideone.com/RZkjWN

+0

おかげさまで、私の主な問題は、文字列に含めることができる数字の数がわからないことです。つまり、50以上の数字はありませんが、文字列内の整数の数はconstではありません。 – Nofix

+0

ゼロを返すまでsscanf(オフセット付き)を繰り返して呼び出します。 – gurka

+0

私はそれを知りません:const文字列を使ってsscanfを使ってどのように反復を行うことができますか?私は、文字列は各干渉のために決して変化しないので、それは無限になるでしょうか?私はscanf( "%c%d"、&test、&tab [0])で繰り返し処理しようとしました。 scanfは決して終了しません... – Nofix

0

解析文字列のscanf()を使用は推奨されません。

他の回答と同様に、strtokを使用して"[],"の数字を解析し、見つかった数字をstrtolで変換することができます。整数変換にはatoi()のようなものを使用するのは危険です。エラーのチェックはエラーではありません。 strtol()のエラーチェックは、man pageにあります。

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

#define MAXNUM 50 
#define BASE 10 

int main(void) { 
    char string[] = "[1,2,3,4,5]"; 
    char *number, *endptr; 
    const char *delim = "[],"; 
    int numbers[MAXNUM], current; 
    size_t i, count = 0; 

    number = strtok(string, delim); 
    while (number != NULL) { 
     current = strtol(number, &endptr, BASE); 

     /* checking if valid digit found */ 
     /* more error checking can be added */ 
     if (endptr != number) { 
      numbers[count++] = current; 
     } 
     number = strtok(NULL, delim); 
    } 

    for (i = 0; i < count; i++) { 
     printf("numbers[%zu] = %d\n", i, numbers[i]); 
    } 

    return 0; 
} 

サンプル入力1:

string[] = "[1,2,3,4,5]"; 

出力1:

numbers[0] = 1 
numbers[1] = 2 
numbers[2] = 3 
numbers[3] = 4 
numbers[4] = 5 

サンプル入力2:ここ

は、いくつかのサンプル(向上させることができる)、これを実行するコードであります

string[] = "[1,a,3,c,5]"; 

出力2:

numbers[0] = 1 
numbers[1] = 3 
numbers[2] = 5