2016-04-17 4 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

прочитайте массив символов и строки в C еще раз. –

+1

Почему бы не сделать массив целых чисел? И вы должны инициализировать массив, потому что вы печатаете 10 значений независимо от того, добавлены ли они в методе ввода –

+0

Что делать, если пользователь (мы не можем доверять пользователям, можем ли мы?) Вводить «S» или «q» или "Выход"? :-) – pmg

ответ

1

удалить «*» от Num [20] декларации, как вы объявляете 20 строк символов указателей, поэтому чтение и сравнение значений с NUM [я] вызовет ошибку. Кроме того, вы просто используете простую строку, чтобы получить оценку.

+0

удаление '*' просто вызовет предупреждение: \t [Warning] Передача аргумента 1 из 'atoi' делает указатель из целого без литья – Miner123

0

Причина, по которой программа разбилась, заключается в том, что num является массивом указателей, элемент num не может указывать на действительную память, которая использовалась для хранения введенной строки. вы можете изменить char *num[10] на char num[10][12] и 'scanf ("% s", & num [i]) to scanf("%s", num[i]), и все будет в порядке.

Конечно, вы можете использовать malloc динамической памяти Alloc для каждого элемента в num, как:

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

Даже думал, вы должны изменить scanf("%s", &num[i]) к scanf("%s", num[i]); Наконец, вы не можете забыть освободить память, которую вы просто динамически изменяете.