2013-05-08 2 views
0

так что я этот код, который должен получить координаты от пользователя:зсап в то время как цикл работает только один раз

#include <stdio.h> 
#include <time.h> 

int main() { 
int number; 
char letter; 
int points = 3; 
    while(points < 8){ 
     printf("give me first coordinate (letter)"); 
     scanf("%c",&letter); 
     printf("give me second coordinate (number)"); 
     scanf("%d",&number); 
    } 
} 

, насколько я знаю, это должно продолжать принимать координаты от пользователя, но вместо он берет его только один раз, а затем подавляет действительно странным образом, как будто он пропускает scanf без какой-либо причины. вот мой выход:

give me first coordinate (letter)a 
give me second coordinate (number)1 
give me first coordinate (letter)give me second coordinate (number)12 
give me first coordinate (letter)give me second coordinate (number)df 
give me first coordinate (letter)give me second coordinate (number)give me first coordinate (letter)give me second coordinate (number)sss 

Я чувствую себя очень смущен, так как это просто код, и я не имею понятия slightes причиняет это. кто-нибудь? (если это имеет значение, моя система - горный лев)

+4

Подумайте о том, как Вы обращаетесь с новой строки, присутствующие на входе. Подсказка: вы сейчас не обращаетесь с ними. –

+0

Вы игнорируете результат операции ввода. Это смертельная ошибка программирования. –

+0

@KubaPolaczek Ошибки сделаны всеми ... но как вы можете избежать этой ошибки в будущем? На мой взгляд, этот вопрос в основном касается «scanf». Я начал бы внимательно читать руководство 'scanf', снова и снова, пока не пойму все это ... Для дальнейшего использования opengroup дает хорошее описание стандартных библиотечных функций C. Вы можете найти руководство opengroup scanf с помощью googling «opengroup scanf». – Sebivor

ответ

5

Одно из возможных решений, чтобы добавить пробел, чтобы пропустить пробелы:

scanf(" %c",&letter); 
    ^

Как пользователь «непредсказуемое поведение» правильно отметили, вы должны также проверить возвращаемое значение , В этом случае вы ожидаете, что возвращаемое значение будет равным количеству элементов, которые вы читаете, если возвращаемое значение <0, то вы больше не можете читать от stdin, а возвращаемое значение меньше количества элементов, которые вы читаете, указывает на то, что вы имеют ошибку преобразования.

+1

Убедитесь, что вы проверили возвращаемое значение. Отрицательные значения указывают на то, что 'stdin' не может быть прочитан больше, и любое возвращаемое значение меньше числа ожидаемых для чтения элементов (в данном случае 1) указывает на то, что произошла ошибка преобразования (например, сценарий, описанный в @VX ниже: «* если вы введете« a »в scanf («% d », & i), вы никогда не получите никаких результатов ... *») – Sebivor

+0

@undefinedbehaviour Хорошая точка, внеся поправки в мой ответ –

-1

Мне лично не нравится использование scanf. Эта функция оставляет входной поток в не так четко определенном состоянии, как он будет выглядеть. Я предпочитаю fgets в сочетании с sscanf ...

+0

Если вы используете его правильно, значит, с ним нет проблем. – Devolus

+0

, если вы введете «a» в scanf («% d», & i), вы никогда не получите никаких результатов ... –

+0

@ V-X Это зависит от того, прочитаете ли вы * руководство *. – Sebivor

2
scanf(" %c",&ch); 

Причина этого в том, что первое пространство сбрасывает stdin, а затем позволяет пользователю вводить символ.

это также работает, если вы поставите /n или /t перед тем %c