2016-11-11 3 views
0

У меня есть функция int getLine(char s[],int lim), которая читает следующую строку ввода, как может кто-то предположить, и возвращает ее длину как целое число. В частностиЧтение строки в C и остановка при достижении предела

int getLine(char s[],int lim) 
{ 
int i; 
char c; 

for(i=0; i<lim-1&&(c=getchar())!='\n'; ++i) 
{ 
    s[i]=c; 
} 
s[i]='\0'; 

return i; 
} 

До сих пор так хорошо, проблема в том, что я не хочу, чтобы пользователь мог добавить столько символов, сколько он хочет, но я хочу, чтобы он был ограничен, и поэтому я добавил этот int lim, но, как я скоро поймут, это не сотрудничает хорошо с другими петлями, например

int main() 
{ 
double len; 
int currentLength=0; 
char s[20]; 
printf("Give an integer N with 1%cN%c30 to make a NxN array\n",242,242); 

do 
{ 
    printf("N="); 
} 
while(!((currentLength=getLine(s,20))>0&&try_Parse(s,&len)&&(len - (int)len)==0&&len>=1&&len<=30)); 

int real_len = (int) len; 
double A[real_len*real_len]; 
for(int i=0; i<real_len; ++i) 
{ 
    for(int j=0; j<real_len; ++j) 
    { 
     do 
     { 
      printf("Give A[%d][%d]=",i+1,j+1); 
     } 
     while(!((currentLength=getLine(s,20))>0&&try_Parse(s,&A[i*real_len+j]))); 


return 0; 
} 

Когда один работает этот код и дает вход для N что-то подобное (N = +0,0000000000000000000001) или даже больше нулей, программа читает первые 20 говорит, что мы достигли предела, возвращает 19 и делает то же самое с остальными, пока не будет больше читать.

Мой вопрос: Как я могу остановить его от чтения ввода, который превышает этот предел?

(try_Parse является функцией, что я создал, не против)

+0

Используйте [ 'fgets'] (http://www.cplusplus.com/reference/cstdio/fgets/) вместо вашего домашнего' 'GetLine? функция. Вернее, 'getline' заменяет тело вашей функции' getline' оболочкой, использующей 'fgets', (~ 5 строк кода). –

+0

для одного я не знаю, как его использовать (конечно, я буду учиться), но я бы хотел решить мою проблему так, как она уже построена. Но все равно спасибо ! –

+3

Если вы достигли предела буфера в 'getLine()' и еще не видели новую строку, добавьте код для чтения следующей новой строки, отбросив символы: 'int ch; while ((ch = getchar())! = EOF && ch! = '\ n'); '(пустое тело цикла). –

ответ

1

Как было предложено в комментариях, если ваш код не читает символ новой строки перед запуском из космоса, он должен «пожирать 'остальная часть строки ввода. Ваш код также должен быть более осторожным в отношении EOF - getchar() возвращает int, а не char (поскольку он должен иметь возможность вернуть любое действительное значение char, а также отличное значение EOF).

Это приводит к такому коду:

#include <stdio.h> 
#include <stdlib.h> 

int getLine(char s[],int lim); 

int getLine(char s[], int lim) 
{ 
    int i; 
    int c; 

    for (i = 0; i < lim - 1 && (c = getchar()) != '\n' && c != EOF; ++i) 
     s[i] = c; 
    s[i] = '\0'; 

    while (c != '\n' && c != EOF) 
     c = getchar(); 

    return i; 
} 

int main(void) 
{ 
    char s[20]; 
    int n; 

    printf("Give an integer N with 1 <= N <= 30 to make a NxN array: "); 
    fflush(stdout); 

    while ((n = getLine(s, sizeof(s))) > 0) 
    { 
     long num = strtol(s, 0, 0); 
     printf("Got length: %ld\n", num); 
     printf("Again: "); 
     fflush(stdout); 
    } 
    putchar('\n'); 

    return 0; 
} 

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

Контрольный код небрежно относится к способу использования возвращаемого значения от strtol(); тестирование, которому это удалось, является гораздо более деликатной задачей. Однако этого достаточно для тестовой программы.

Пример использования (название программы rl13):

$ ./rl13 
Give an integer N with 1 <= N <= 30 to make a NxN array: 23 
Got length: 23 
Again: 0000000000000000000000001 
Got length: 0 
Again: 0 
Got length: 0 
Again: 
$ 
Смежные вопросы