2016-07-11 2 views
1

Мне нравятся основания C: -scanf ("% d", int) вчера, а не сегодня. Что происходит?

В этой программе есть две итерации scanf(). Первый полностью функциональный. Второй внешний вид ничего не делает и вместо этого выходит из программы и возвращается к стандартной строке командной строки.

Кроме того, мой второй цикл печатает только первые 4 цифры вместо 5.

Вот код:

int main() { 
    int i; 
    int iNum[4] 
    int iMenu = 0; 

    printf("\n\n\tPlease enter five numbers: "); 
    for (i = 0; i < 4; i++) { 
     scanf("%d ", &iNum[i]); 
    } 
    printf("\n\tThank you. Here are your numbers: \n\t"); 

    for (i = 0; i < 4; i++) { 
     printf("%d", iNum[i]); 
    } 
    printf("\n\tMenu:"); 
    printf("\n1\tSort your numbers ascending."); 
    printf("\n2\tSort your numbers descending."); 
    printf("\n3\tQuit program"); 
    printf("\n\nWhat would you like to do?\n\tEnter your option here: "); 
    scanf(" %d", &iMenu); 

    switch (iMenu) { 
     case 1: 
      printf("\nCase1testPrint"); 
      sortAsc(); 
      break; 
     case 2: 
      printf("\nCase2testPrint"); 
      sortDesc(); 
      break; 

. . .//rest of code } 

Как только программа достигает второго Scanf(), программа заканчивается и возвращается в командную строку.

Это непонятно, и я пробовал много вариантов того, что может быть неправильным. Пожалуйста, предоставьте то, что вы можете.

Вот как это выглядит, если я запускаю программу. Обратите внимание на мой вход «1» появляется в командной строке вместо программы:

C:\Users\Cortland\Documents\C projects>gcc arraysort.c 
C:\Users\Cortland\Documents\C projects>a 

     Please enter five numbers: 3 
6 
5 
4 
5 

     Thank you. Here are your numbers: 
     3 6 5 4 
     Menu: 
1  Sort your numbers ascending.  
2  Sort your numbers descending. 
3  Quit program 

What would you like to do? 
     Enter your option here: 
C:\Users\Cortland\Documents\C projects>1 
+3

Ваш текст запрашивает у человека пять цифр, но ваш массив имеет место только для 4, и ваш код на самом деле получает 4 номера. Но ваш вывод, похоже, показывает, что он запрашивает пять номеров. Что-то здесь не соответствует. –

+0

'for (i = 0; i <4; i ++) {' будет перебирать 0, 1, 2, 3. почему бы не 4? потому что '<' не включает '=' – fukanchik

+1

Это не ваш реальный код. В объявлении 'iNum' есть точка с запятой. (Вам также не хватает '#include ', но компилятор lax может позволить вам скомпилировать его без него.) Если вы не скопируете и не вставьте фактический код, который обнаруживает проблему, мы не можем различать ошибки в вашем фактическом коде и ошибки, введенные вами при их суммировании. –

ответ

0

Есть несколько ошибок.

Во-первых, вторая строка функции main() содержит синтаксическую ошибку - в конце должна быть точка с запятой. Это должно остановить вашу программу даже от компиляции.

Во-вторых, хотя вы говорите, что хотите, чтобы пользователь вводил 5 номеров, ваш массив и циклы используют номер 4. Причина, по которой ваша программа по-прежнему позволяет ввести пять чисел, однако, объясняется тем, как вы написала строку форматирования в ваших вызовах scanf(). Вместо того, чтобы:

scanf("%d ", &iNum[i]); 

использование

scanf("%d", &iNum[i]); 

Обратите внимание на отсутствие пробела в конце строки форматирования? Вот где ваши проблемы возникают. Даже если вам разрешено вводить пять номеров, программа сохраняет и проверяет только четыре из них. Последний номер застрял во входном потоке - до следующего вызова scanf(). Это выводит ваш последний номер, который помещается через оператор switch/case (сбой всех случаев, так как вы не вводили «1», «2» или «3»), и программа достигает конца main() и выходы. «1» в командной строке происходит от попытки ввода чего-либо, когда программа уже закончилась.

Обобщенная:

1: Добавьте недостающую точку с запятой

2: Изменить номер, используемый в объявлении iNum и в течение циклов от 4 до 5

3: Измените зсапЕ (), удаляя пробелы из строк форматирования.

Это устранило проблему на моем конце.

+0

Благодарим за отзыв. 1. Это была ошибка передачи: у программы был правильный синтаксис и не было проблем с компиляцией. 2. Использование 4 вместо 5 было глупой ошибкой, считая, что 0 считается как первый индекс, так и первый блок. Неправильно! 3. Пробел был тем, что меня отбросило. Целью было чистое форматирование, но результат был причиной ошибок. Я удалил пробел из scanf и добавил новый printf ниже, но все еще в цикле, который добавляет ''. Спасибо winterweird. – Naltroc

3

Ваш for цикл читает четыре цифры, а не пять.

Вы вводите пять номеров. Первые четыре считываются в цикле for. Пятый читает

scanf(" %d", &iMenu); 

Итак, вы вошли как 3 6 5 4 четырех цифр, а затем 5 как выбор, что делать. Вы не показали нам весь оператор switch, но я предполагаю, что он не обрабатывает значение 5 и что он проваливается, и ваша программа завершается.

(Кроме того, вы всегда должны проверить значение, возвращаемое scanf(), и принять какое-то действие, если оно указывает на то, что операция ввода не удалось.)