0

私はCが初めてで、Ifステートメントを使用してユーザーからの文字入力を配列に格納されたintと比較するのに問題があります。

例えば:

    int i[2] = {1,2};
    char input[3];
    printf("Select option:");
    fgets(input,3,stdin);

    if(strcmp(*input,i[0]) == 0)
       printf("1 chosen");
    if(strcmp(*input,i[1]) == 0)
       printf("2 chosen");

コンパイルすると、両方の比較ステートメントに対して次のような警告が表示されます。

    warning: passing argument 1 of 'strcmp' makes pointer from integer without cast
    warning: passing argument 2 of 'strcmp' makes pointer from integer without cast   

これは、文字列以外の要素を比較している可能性があることを理解していますが、それらをキャストしてから比較するにはどうすればよいですか?

実行すると、次のようになります。

     Segmentation fault(core dumped)

誰か助けてくれませんか?

4

7 に答える 7

2

それが「間違っている」と言う以外に、あなたがしていることがなぜ間違っているのか、まだ誰も説明していません。

C の文字列は、メモリ内の連続した文字の集まりであり、文字列の最後の文字の値は 0 です。文字列を配列に格納するか、ポインタ ( )charを使用してメモリ内のどこかを指すことができます。charchar*

10 進数を入力すると、たまたま から までの範囲にある個々の文字が読み取ら'0'れます。'9'オプションの'-'. これらを文字列として読み取ります。それらを整数として扱いたい場合は、(一連のchar値ではなく) 整数データ型に変換する必要があります。

atoiもはやファッショナブルではありませんが、そのようなものが役立ちます。を使用する必要がありますstrtolunsigned[ 、long long、またはそれらの組み合わせ、doubleおよび型を処理するためのこれらの関数のファミリ全体がありfloatます]。

これで、質問の約半分に取り組みます。今、あなたはそれを使用しstrcmp、それが機能することを期待しています. あなたがしていることにはいくつかの間違いがあります。主なエラーは、整数を文字列として扱うことができないことです。本当に文字列比較を使用したい場合は、整数を文字列に変換する必要があります。つまり、行うことの逆を行いますstrtol

それはより大きな議論であり、あなたの場合は正しい方法ではないので、私はそれに立ち入りません. ただし、すべてが等しい場合、間違った型を に送信していることを指摘したいと思いますstrcmp。2 つのchar*ポインター ( const char *、本当に) が必要です。あなたが行ったことは、最初の要素inputの a へのポインターを逆参照し、2 番目charの要素に an を渡すことintです。

strcmp(*input,i[0])

ポインタは基本的に単なる数値です。一部のデータのメモリアドレスを提供します。この場合、データはchar型 (1 バイト) であると予想されます。strcmp関数は有効なメモリ アドレス (実際にスタックまたはヒープにあるもの) を期待しています。しかし、あなたが与えるのは*input(入力文字列の最初の文字の値) とi[0](数値1) です。

これらのコンパイラの警告は、非常に重要なことを示していました。=)

したがって、完全を期すために(他の人はすでにこれに答えていますが)、文字列の比較を忘れて(Cの文字列についてもっと学ぶために心に留めておいてください)、これを行う必要があります:

int value = strtol( input, NULL, 10 );

if( value == i[0] )
   printf("1 chosen");
if( value == i[1] )
   printf("2 chosen");

これについては他にも方法があります。文字列から 1 桁の数字を変換する方法について話すこともできますが、もう十分長く怒鳴っていると思います。これが役立つことを願っています。

于 2013-03-22T11:36:32.777 に答える
1

あなたのqnへの回答としてリストされているさまざまな方法とは別に。

ユーザー入力を int として取りませんか??

#include<stdio.h>

int main()
{

int i[2] = {1,2};
int input;
    printf("Select option:");
    scanf("%d",&input);

    if(input==i[0])
       printf("1 chosen");
    if(input==i[1])
       printf("2 chosen");

return 0;

}
于 2013-03-22T11:08:34.827 に答える
1

fgets の代わりに scanf を使用する必要があります。

int input;
printf("Select option:");
scanf("%d", &input);
if (input == i[0])

など。

http://en.wikibooks.org/wiki/C_Programming/Simple_input_and_output#Input_using_scanf.28.29を参照してください。

于 2013-03-22T11:12:06.650 に答える
0

入力文字列といくつかの既知の文字列を比較する必要があります。しかし、最初の文字といくつかの整数を比較しています。 strcmp()正しい引数を渡すと、必要なことを実行します: 2 つの文字列です。

于 2013-03-22T11:02:52.700 に答える
0

ここでは、strcmp を使用して文字列を整数と比較しようとしています。

if(strcmp(*input,i[0]) == 0)

それはうまくいきません。

あなたはそのようにすることができます:

const char *numbers[2] = {"1", "2"};
char input[3];
printf("Select option:");
fgets(input,3,stdin);

if(strcmp(*input, numbers[0]) == 0)
    printf("1 chosen");
if(strcmp(*input, numbers[1]) == 0)
    printf("2 chosen");

数値と文字列を比較する代わりに、2 つの文字列を比較する場合

または、sscanf または atoi を使用して、入力文字列を int に変換できます。

int i[2] = {1,2};
char input[3];
int num;

printf("Select option:");
fgets(input,3,stdin);

sscanf(input, "%d", &num);

if(num == i[0])
   printf("1 chosen");
else if(num == i[1]) 
   printf("2 chosen");

私はそれらをコンパイルしませんでしたが、おそらく私が見逃しているsthがあるかもしれませんが、それは一般的な考えです

于 2013-03-22T11:05:52.433 に答える
0

を使用しatoiます。文字列を整数に変換します

 int i[2] = {1,2};
    char input[3];
    printf("Select option:");
    fgets(input,3,stdin);

    if(atoi(input)==i[0]))
       printf("1 chosen");
    if(atoi(input)==i[1]))
       printf("2 chosen");
于 2013-03-22T11:10:43.633 に答える
0

atoi 関数を使用して、入力 char を int に変換することをお勧めします。

http://www.cplusplus.com/reference/cstdlib/atoi/

int i[2] = {1,2};
char input[3];
int opt=0;
printf("Select option:");
fgets(input,3,stdin);
opt = atoi(input); 
if(opt== i[0])
   printf("1 chosen");
if(opt == i[1])
   printf("2 chosen");
于 2013-03-22T11:14:24.483 に答える