2014-04-20 2 views
3

Я новичок в программировании на C. И я занимался практикой, и вопрос звучит так: используйте оператор?: И оператор for, чтобы написать программу, которая продолжает брать символы, введенные пользователем, до тех пор, пока не будет учтен символ q.для цикла работает дважды в C

А вот программа, которую я написал:

#include <stdio.h> 

main() 
{ 
    int x, i=0; 
    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n",i)) 
    { 
     printf("Enter q to exit!!!\n"); 
     printf("Please enter a character:\n"); 
     x=getc(stdin); 
     putc(x,stdout); 
     ++i; 
    } 
    printf("\nThe for loop is ended. Bye!"); 

    return 0;  
} 

Проблема в том, каждый раз, когда я вхожу в «не-Q» характер, цикл, кажется, дважды баллотировался. Я не знаю, что не так с моей программой. Пожалуйста, помогите!

+2

Кажется, вам нужно очистить входной буфер, потому что вы читаете в новой строке, я думаю. – zeitue

ответ

1

Цикл работает дважды, потому что, когда вы вводите символ не q, вы фактически вводите два символа - символ не q и символ новой строки '\n'. x = getc(stdin); читает символ q из потока stdin, но строка новой строки все еще лежит в буфере stdin, который читается в следующем вызове getc.

Вы должны использовать fgets, чтобы прочитать строку из потока, как предложили другие, и затем вы можете обработать линию. Кроме того, вы должны указать тип возврата main как int. Я предлагаю следующие изменения -

#include <stdio.h> 

int main(void) 
{ 
    int x, i = 0; 

    // array to store the input line 
    // assuming that the max length of 
    // the line is 10. +1 is for the 
    // terminating null added by fscanf to 
    // mark the end of the string 
    char line[10 + 1]; 

    for (x = 0; x == 'q'? 0 : 1; printf("Loop %d is finished\n", i)) 
    { 
     printf("Enter q to exit!!!\n"); 
     printf("Please enter a character:\n"); 

     // fgets reads an input line of at most 
     // one less than sizeof line, i.e., 
     // 10 characters from stdin and saves it 
     // in the array line and then adds a 
     // terminating null byte 
     fgets(line, sizeof line, stdin); 

     // assign the first character of line to x 
     x = line[0]; 
     putc(x, stdout); 
     ++i; 
    } 
    printf("\nThe for loop is ended. Bye!"); 

    return 0;  
} 
4

Когда вы вводите письмо не q, вы также нажмете Введите, который читается во втором цикле.

Чтобы цикл работал только один раз для ввода, используйте fgets(), чтобы прочитать всю строку ввода сразу и проверить, соответствует ли строка ввода вашим ожиданиям.

+0

Итак, как вы можете запустить его только один раз? – MechAvia

+0

Другими словами, есть два символа для 'getc (stdin);' читать, и это делает работу! – ultifinitus

+0

использовать 'scanf' вместо –

3

При вводе a, а затем нажмите Enter, символ новой строки станет частью потока stdin. После чтения a при следующем выполнении x=getc(stdin) значение x установлено на \n. Вот почему выполняются две итерации цикла.

1

При вводе символа, говорят «х» и нажмите Enter, вы на самом деле ввода двух символов, которые являются «х» и «\ п», также известный как символ новой строки (когда вы нажмите enter). «\ N» становится частью входного потока, и цикл также выполняется для него.

Кроме того, попробуйте ввести «xyz» и нажмите enter, цикл будет выполнен 4 раза. Для каждого «x», «y», «z» и «\ n».

Если вы хотите, чтобы код работал один раз для каждого входа, используйте функцию get.

#include <stdio.h> 

main() 
{ 
    int i=0; 
    char x[10]; 
    for (; x[0]!='q'; printf("Loop %d is finished\n",i)) 
    { 
     printf("Enter q to exit!!!\n"); 
     printf("Please enter a character:\n"); 
     gets(x); 
     i++; 
    } 
    printf("\nThe for loop is ended. Bye!"); 

    return 0; 
} 

В этом коде мы объявили х в виде строки, то получает() функция считывает всю строку мы вошли, то в состоянии части для цикла, мы проверяем, является ли первый символ строки ' q 'или нет.

Смежные вопросы