-4

このコードの何が問題なのですか?エラーなしでコンパイルされますが、実行するとバスエラーが発生します

#include <wchar.h>
#include <stdio.h>


int main(void)
{
char *a =  "yes";
char *b = "no";
char *c = "";

        puts ("\ntype yes or no for selection\n");
        puts ("do you like icecream\n");
        scanf("%c", &*c);

                if (*c == *a){
                puts("you win $1000000000");
                }

                if (*c == *b){
                puts("you loose $50");
                }
return 0;
}
4

7 に答える 7

2

開始するためのヒントがいくつかあります。

  1. char 変数へのポインターではなく、ユーザーの回答を文字列として保存します。したがって、 を使用する代わりに、 を使用char *cできますchar c[4]
  2. ユーザーの回答を取得するときはscanf("%s", c);、ユーザーの入力が文字ではなく文字列であるyesまたはになるため、 を使用します。no
  3. ユーザーの回答を定義済みの回答と比較するstrcmp場合は、文字だけでなく文字列を比較しているため、メソッドを使用します。
于 2013-11-15T03:54:08.570 に答える
2
char *c =  "";

書き込み不可能なメモリ内の長さ 0 の文字列への ca ポインターを宣言します。そのため、scanf() には書き込み先のバイトがありません。

于 2013-11-15T03:54:32.630 に答える
0

scanf("%c", &*c);

この行は、ユーザーの入力を に保存しようとしますconst char *。次のようなものを宣言したら:

char *foo = "bar";

変更することはできません。

文字列を変更する場合は、自動または動的にメモリを割り当てる必要がありますmalloc()

char foo[10] = "bar"; または単にchar foo[10]

于 2013-11-15T04:13:50.327 に答える
0

変数を文字 (char) として定義すると、1 バイト (8 ビット) しか保持できません。それ以外の場合は、変数を文字列 (%s) として宣言する必要があります。文字を使用する必要がある場合は、「はい」の場合は文字「y」、「いいえ」の場合は文字「n」をユーザーに入力させることができます。

char *a =  "yes"; /*Wrong*/
char *b = "no";   /*Wrong*/

不必要にポインターを使用しました。指針がなくても、目標は簡単に達成できます。

char *c = "";  /* Wrong */

scanf() 演算子を使用しているため、「c」に何も割り当てる必要はありません。そう

char c;  /*would be fine*/

ユーザーが「y」または「n」のいずれかを入力すると、文字は「c」のアドレスにコピーされます。

于 2013-11-15T06:08:54.353 に答える
0

pointer にメモリを割り当てる必要がありますc。文字列をスキャンしようとしています。しかし、文字列はどこに保存されるのでしょうか? 以下を変更

char *c = "";

char c[MAX]; //you #define MAX to maximum length of the string.

文字列をスキャンしている間、使用します

scanf("%s",c); 

変数にメモリが割り当てられている場所を知るには (参照用)、https://stackoverflow.com/a/18479996/1814023

于 2013-11-15T03:55:45.940 に答える
0

char *a="はい";

+----------+
|    y     |     4000
+----------+ 
|    e     |     4001
+----------+
|    s     |     4002
+----------+
|    \0    |     4003
+----------+

アドレスが 4000 から始まるとします。このように文字がメモリに格納され、4000 が a に割り当てられます。同じことが他の 2 つの定義にも当てはまります。SO c に空の文字を格納します。また、a、b、c はすべて読み取り専用メモリであり、実行時にデータを変更または保存することはできません。

文字列入力を取得しますが、文字のみを比較します。代わりに、文字入力を取得できます。シンプルに。

int main(void)
{
    char *a="yes";
    char *b="no";
    char *c=malloc(sizeof(char));
    puts ("\ntype yes(y) or no(n) for selection\n");
    puts ("do you like icecream\n");
    scanf("%c",c);
    if (*c == *a)  puts("you win $1000000000");
    if (*c == *b)  puts("you lose $50");
  return 0;
}


int main(void)
{
    char c;
    puts ("\ntype yes(y) or no(n) for selection\n");
    puts ("do you like icecream\n");
    scanf("%c",&c);
    if (c == 'y')  puts("you win $1000000000");
    if (c == 'n')  puts("you lose $50");
return 0;
}
于 2013-11-15T04:24:40.917 に答える