Входная строка с 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);
}