2015-04-22 6 views
3
int main() 
{ 
    int t, i; 
    int *nums; 
    scanf("%d", &t); 
    nums = malloc(t * sizeof(int)); 
    for(i = 0; i < t; i++) 
    { 
     scanf("%d", &nums[i]);   
    } 
    printf("hey"); 
} 

По какой-то причине он висит, ожидая большего количества ввода! Есть идеи?Почему C-петля не работает должным образом?

+0

Комментарии не для широкого обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/75968/discussion-on-question-by-antoni4040-why-is-this-c-for-loop-not-working- должным образом). – Taryn

+0

@Wather Vane thats правильно, но с использованием Visual C++ не скомпилируется без трансляции. Так что это было предложение. – Diversity

+0

Работает со мной. Я использую visual studio 2010. – CroCo

ответ

1

Этот код верный, за исключением того факта, что вы не освобождаете свою память (не большая проблема для этого простого кода), и вы не проверяете scanf на наличие ошибок, что может быть причиной вашей проблемы.

Лучше выполнение с проверкой ошибок и правильной обработки памяти описан ниже:

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

int main() 
{ 
    int t, i, ret; 
    int *nums; 

    ret = scanf("%d", &t);   
    if(ret != 1) 
    { 
     /* something wrong */ 
    } 

    nums = malloc(t * sizeof(int)); 
    if(nums==NULL) 
    { 
     /* memory error */ 
    } 

    for(i = 0; i < t; i++) 
    { 
     ret = scanf("%d", &nums[i]);   
     if(ret != 1) 
     { 
      /* something wrong */ 
     } 

    } 
    free(nums); 
    printf("hey"); 

    return 0; 
} 
+1

Это не объясняет, почему она зависает на scanf или в каком scanf она висит. –

+0

Он зависает, даже если я пишу его так: int nums [5] – Antoni4040

+2

В нем говорится, что «он висит, ожидая большего ввода», поэтому это повешение очень сомнительно. – Tarantula

1

Просто догадка ...

Но я предполагаю, что вы запустили его и вошли:

4 
1234 

Например, вы помещаете 4, а затем 1234, и это зависает. Ну, это было бы потому, что 1234 - это первое число, а не 4 разных числа, поэтому он ждет второго номера. Вам нужно нажать enter или некоторый такой разделитель между каждым числом.

Попробуйте этот набор входов вместо:

4 
1234 
29 
4 
5 

Вы должны получить:

hey 

Pro грамматически, вы должны проверять возвращаемые значения из вызовов функций. Убедитесь, что malloc не возвращает ноль. Убедитесь, что scanf возвращает количество входов, которые вы ожидали прочитать. Добавьте в распечатки, чтобы убедиться, что значения, которые они читают, - это то, что вы ожидали/хотели прочитать.

EDIT: Угадайте, что у вас есть опечатка в программе, которая здесь не отображается. таких как:

scanf("%s", &t); 

Или вы получаете «эй» и просто не видите его.

[[email protected] sotest]$ ./a.out 
5 5 4 3 23 1 
hey[[email protected] sotest]$ 

Смотрите «эй» является своего рода скрытый в моем приглашении, потому что вам не хватает «\ п» новую строку в распечатке?

+0

Я вошел 5 5 4 3 2 1, должен работать, не так ли? – Antoni4040

+0

Вы буквально вводили пробел между номерами или ударили? –

+0

Пробовал оба случая, те же результаты ... – Antoni4040

1

Помните, что вы почистите, когда закончите.

В чате комментарии OP «Нет ... BTW, если я добавлю printf в цикл, который печатает текущий вход, он печатает все, кроме последнего ...». Это намекало, что проблема была на конечном выходе.

Следующие данные отправляются для печати. Но stdout обычно буферизуется. Фактический вывод может не произойти до тех пор, пока через некоторое время. Выходной сигнал сбрасывается, когда 1) вывод содержит конец строки '\n', 2) fflush() называется 3) программа заканчивается. Я удивлен, что результат не появился, когда программа закончилась, но, возможно, истинный код OP отличается от сообщения.

printf("hey"); 

Изменения в

printf("hey\n"); 

Или @Cool Guy

printf("hey"); 
fflush(stdout); 

BTW: Это также намекнул в @Diversity ответ.


Примечание: Всегда хорошая идея, чтобы проверить результат scanf()

// scanf("%d", &t) 
if (1 != scanf("%d", &t)) Handle_BadInput_or_EOF(); 
Смежные вопросы