2016-04-17 19 views
-3

私は、ユーザーがグレード(1〜5)を入力し、後で検査するためにグレードが配列に追加されるプログラムを作成しています。ユーザーが文字「s」を入力すると、プログラムは終了します。私のプログラムが失敗したとき、なぜですか?C配列を使用して文字列を整数に変換する

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

int i; 
int grade[50]; 
char *num[20]; 

int enter(); 
int enter() 
{ 
    for (i=0; i<10; i++) { 

     printf("\nEnter grade:\nPress [s] to close program\n"); 
     scanf("%s",&num[i]); 
     if (strcmp(num[i],"s") == 0) { 
      break; 
     } else { 
      grade[i] = atoi(num[i]); 
     } 
    } 
} 

int main() 
{ 
    enter(); 

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

    return 0; 
} 
+0

char配列とCの文字列をもう一度読み込みます。 –

+1

なぜ整数の配列を作るのですか?そして、あなたがEnterメソッドで追加されているかどうかにかかわらず10個の値を印刷するので、配列を初期化する必要があります –

+0

ユーザ(私たちはユーザを信じることはできません)は "S"か "q" "出口"? :-) – pmg

答えて

1

NUMから削除 '*' [20]宣言、あなたは20個の文字列のポインタを宣言するので、NUMで値を読み取ると比較される[i]はエラーが発生します。 さらに、グレードを得るために単純な文字列をneadします。

+0

'*'を削除すると警告が発生します:\t [警告] 'atoi'の引き数1を渡すと、キャストなしの整数からポインタが作成されます – Miner123

0

プログラムがクラッシュした理由は、numがポインタ配列であるため、numの要素は、入力した文字列を格納していた有効なメモリを指すことができません。 char *num[10]char num[10][12]に変更し、 'scanf( "%s"、& num [i])to scanf("%s", num[i])を変更しても問題ありません。もちろん

、あなたは次のように、num内の各要素に対してダイナミックアロケーションメモリにmallocを使用することができます。でも、あなたがscanf("%s", num[i])scanf("%s", &num[i])を変更しなければならない、と思ったが

`for(i = 0; i < 10; i ++){ 
    num[i] = (char*)malloc(sizeof(char) * 12); 
    } 
` 

。 最後に、動的mallocだけのメモリを解放することを忘れることはできません。

関連する問題