2014-11-17 3 views
2

Я пытаюсь прочитать строку в массив символов с длиной, выбранной пользователем. Проблема в том, что getchar() не прекращает чтение, пока пользователь не вручную вводит новую строку, нажимая enter, на основе моего кода. Я прочитал другие темы, и я понимаю, почему я не могу это сделать, это просто полностью противоречит моему раздаче раздачи.Строка ввода с getchar

int chPrompt(int nchars); 
void strInput(char str[], int nchars); 

int main(void) { 
    int nchars = chPrompt(nchars); 
    char str[nchars]; 

    strInput(str, nchars); 

    return 0; 
} 

int chPrompt(int nchars) { 
    printf("How many chars do you need to input? >"); 

    return scanf("%i", &nchars); 
} 

void strInput(char str[], int nchars) { 
    int i = 0; 

    while((str[i] = getchar()) != '\n') { 
     if(i > nchars-1) 
      break; 
     i++; 
    } 
    str[i] = '\0'; 

    //Troubleshooting 
    printf("%s %d", str, strlen(str)); 
} 

Это то, что раздаточный материал говорит:

Введите строку с клавиатуры (входит в пространстве) с использованием методы мы говорили о (в то время как с GetChar(), не получает(), fgets() или scanf()), дополнено, чтобы ввести любую сумму до, но не более 80 символов. Убедитесь, что после ввода нулевой точки в нужном месте.

Методом, о котором мы говорили в классе, был цикл while с назначением getchar для массива char.

Мой вопрос: Мой профессор очень категоричен в своих инструкциях. В этом раздаточном материале он специально говорит мне вводить любую сумму до, но не более 80. Это противоречит функциональности getchar, правильно? Есть ли способ ограничить длину строки, используя эту «технику»?

В некоторых из нитей, которые я нашел, люди упомянули, что это зависит от ОС. Итак, если это имеет значение, я нахожусь в Windows 8.1.

+0

'char str [nchars];' → 'char str [nchars + 1];'. Вы пропустили пробел для нулевого символа. То, что вы говорите, это «режим буферизованного ввода». –

+0

@GrzegorzSzpetkowski Взятый уход! Спасибо за напоминание. Есть ли способ обойти буферный режим ввода? Или я неправильно интерпретирую раздаточный материал? – LukeFi

+0

«Это противоречит функциональности getchar, правильно?» - Нет, не правильно. Кажется, у вас есть мусор, связанный с fgets. –

ответ

2

Код Опыта близок.

«getchar() не прекращает чтение до тех пор, пока пользователь вручную не вводит новую строку, нажав« enter »неверно.
Типичный пользовательский ввод строка буферизирована. Ничего не дается программе до . Введите. В это время вся строка предоставляется программе. getchar() потребляет 1 char за один раз за stdin.

1) необходимо выделить достаточное буферной памяти @Grzegorz Szpetkowski
2) Читать вход как int и читать дополнительные по мере необходимости.
3) Не возвращайте значение от scanf() в качестве номера для чтения.
4) Прочитайте оставшуюся строку после прочтения номера char для чтения. @Grzegorz Szpetkowski

getchar() возвращает unsigned char или EOF. Это, как правило, 257 разных результатов. Чтение getchar() в char теряет это различие.

void strInput(char str[], int nchars) { 
    int i = 0; 
    int ch; 
    while((ch = getchar()) != '\n' && ch != EOF) { 
    if (i < nchars) { 
     str[i++] = ch; 
    } 
    } 
    str[i] = '\0'; 
} 

int main(void) { 
    int nchars = chPrompt(nchars); 
    char str[nchars + 1]; // + 1 
    strInput(str, nchars); 

    //Troubleshooting 
    printf("'%s' %zu", str, strlen(str)); 

    return 0; 
} 

int chPrompt(int nchars) { 
    printf("How many chars do you need to input? >"); 
    if (scanf("%i", &nchars) != 1) { 
    printf("Unable to read #\n"); 
    exit(-1); 
    } 

    // Consume remaining text in the line 
    int ch; 
    while((ch = getchar()) != '\n' && ch != EOF); 

    return nchars; 
} 

Примечание: strlen() возвращает тип size_t, не int, это может/не может быть одинаковым на вашей платформе, лучше всего использовать правильный спецификатор формата "%zu" с strlen().В качестве альтернативы можно использовать:

printf("'%s' %d", str, (int) strlen(str)); 
+0

По какой-то причине после ввода nchars он выводит printf, который я искал, и затем выходил из программы. Я вернул исходный код с помощью ctrl + z, и теперь мой код делает то же самое. Не так уверен, что пошло не так: S – LukeFi

+1

@ LukeFi: Обратите внимание, что 'scanf()' call оставляет "осиротевшего символа' '\ n'' в' stdin'. Используйте 'while (getchar()! = '\ N');' (вы можете поставить точку с запятой в отдельной строке с отступом для ясности), чтобы избавиться от нее. Совмещать 'scanf()' с предстоящим 'getchar()' немного сложно. –

+0

@LukeFi Grzegorz Szpetkowski верен. За ваш пост, похоже, вы можете жестко закодировать длину 80 в код, а не запрос для него. – chux

0

Этот код может быть исправлена ​​в несколько большем количестве мест (например, подсчет символов, введенных таким образом, что вы позволяете пользователю вводить не более 80 символов, и т.д.), но это будет указывать вам в правильном направлении:

#include <stdio.h> 
#include <string.h> 

void strInput(char str[], int nchars); 

int main(void) { 
    int nchars = 0; 

    printf("How many chars do you need to input?\n"); 
    scanf("%d\n", &nchars); 

    char str[nchars+1]; 

    strInput(str, nchars); 

    return 0; 
} 

void chPrompt(int nchars) { 
} 

void strInput(char str[], int nchars) { 
    int i = 0; 

     char c; 
    while((c = getchar()) != '\n' && i <= (nchars-1)) { 
      str[i] = c; 
      i++; 
    } 
    str[i] = '\0'; 

    printf("%s %d\n", str, (int)strlen(str)); 
} 
+0

Я применил изменения, но по какой-то причине программа выходит сразу после подсказки nchars. Единственным выходом является оператор printf, который я использовал для устранения неполадок. – LukeFi

+0

Он выходит, поскольку больше нечего делать. Измените его, что бы вы ни хотели. – syntagma

+0

Хорошо, я думаю, что теперь он соответствует критериям на раздаточном материале. Он считывает указанную сумму в строку, но getchar по-прежнему заполняет буфер до тех пор, пока пользователь вручную не войдет в новую строку, нажав клавишу ввода. Разве это не так? Спасибо за помощь :) – LukeFi

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