Входная строка с getchar

Я пытаюсь прочитать строку в массив символов с длиной, выбранной пользователем. Проблема в том, что 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(), а не get (), fgets() или scanf()), дополненные, так что он будет вводить любую сумму до, но не более 80 символов. Убедитесь, что после ввода введен ноль в правильном месте.

Техника, о которой мы говорили в классе, была циклом while с присваиванием getchar массиву char.

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

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

2 ответа

Решение

Код опа близок.

"getchar () не прекращает чтение, пока пользователь не введет новую строку вручную, нажав клавишу ввода" - неверно.
Типичный пользовательский ввод - это буферизация строки. Ничто не передается программе, пока не произойдет ввод. В это время вся строка передается программе. 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));

Этот код можно исправить еще в нескольких местах (например, подсчитав введенные символы, чтобы пользователь мог ввести не более 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));
}

Небольшое изменение в приведенных выше ответах. Попробуйте, это не дает никакой "ошибки заполнения буфера"

  #include<stdio.h>
#include<string.h>
void getinput(char str1[],int s){
    int i=0;
    printf("inside fn\n");
    char c;
    while((c=getchar())!=EOF && i<=(s-1))
    { str1[i++]=c;
    }
    str1[i]='\0';}
void main()
{ int size;
    printf("enter the no. of characters \n");
    scanf("%d", &size);
    char str1[size+1];
    getinput(str1,size);
    printf("%s \n",str1);
}
Другие вопросы по тегам