2009-08-27 3 views
1

Я хотел бы знать, как читать строку из стандартного ввода длины 'n'. Я попытался с помощью fgets() функцию, но была проблема, если я представить строку длины> пКак читать строку длины 'n' из стандартного ввода

#include <stdio.h> 

int STRING_SIZE=4; 
int getString(char *); 

int getString(char *str) 
{ 
    printf("\nEnter a string of length < %d: ", STRING_SIZE); 
    fgets(str, STRING_SIZE, stdin); 
    fflush(stdin); 
    printf("\n\n%s\n\n",str); 
    return 0; 
} 


int main(void) 
{ 

    char str1[1024]; 
    char str2[1024]; 

    getString(str1); 
    getString(str2); 

    fprintf(stdout, "%s\n", str1); 
    fprintf(stdout, "%s\n", str2); 

    return 0; 
} 

если ввести строку размером более 4 для str1, то оставшиеся символы становятся автоматически выделяются str2 ,

Так есть способ, которым я могу дать строки для str1, str2, даже после указания строки> STRING_SIZE?

Я использую GCC 4.3 компилятору, и если я компилирую выше исходного кода

$ ./a.out 

Enter a string of length < 4: 12345678 


123 


Enter a string of length < 4: 

456 

123 
456 
+0

Не ясно, что ваша цель – qrdl

+1

используя fflush() на входе потоков определено в C – 2009-08-27 15:18:11

+0

Благодаря «Нил Баттерворта» Я никогда не буду пытаться использовать таким образом снова. – codingfreak

ответ

3

Одна из стратегий - проверить вашу строку на наличие новой строки; если вы его не нашли, то ваш пользователь потенциально введет строку, которая слишком длинна для целевого буфера. В этом случае, вы можете позвонить в несколько раз fgets() со вторым, фиктивного буфера в качестве цели и выбросить подделками:

if (fgets(str, STR_SIZE, stdin) != NULL) 
{ 
    char *nl = strchr(str, '\n'); 
    if (nl == NULL) 
    { 
    /** 
    * Newline not found, input string too long for target buffer. 
    * Repeatedly read from input stream into a dummy buffer 
    * until newline is seen or fgets() returns EOF or error. 
    */ 
    char dummy[STR_SIZE]; 
    char *r; 

    printf("Warning - input string longer than expected, ignoring excess characters\n"); 

    do { 
     r = fgets(dummy, sizeof dummy, stdin); 
    } while (r != NULL && strchr(dummy, '\n') == NULL); 
    } 
    else 
    { 
    /** 
    * Input string is okay, remove newline character 
    */ 
    *nl = 0; 
    } 
} 
else 
{ 
    /** 
    * EOF or error detected on read; handle that here 
    */ 
} 
+0

Спасибо, Джон действительно очень информативный и простой метод .... – codingfreak

1

Убедитесь, что вы выделить str1 и str2 правильно.

char str1[STRING_SIZE]; 
char str2[STRING_SIZE]; 

Кроме того, имейте в виде, что fgets будет обнулить концевую заделку вашей строки, так что вы на самом деле только получать STRING_SIZE - 1 символ.

+0

Hi Andrew Я просто добавляю код. Я думаю, что я просто делаю это правильно, как вы это упомянули. – codingfreak

1

Использование getch в цикле.

+7

getch не является стандартной функцией, getc/fgetc is. –

0

Дайте этому выстрел, используя ЕОКП() вместо получает(). Я немного быстро тестировал OS X. Я сделал несколько других изменений, которые не имеют большого значения. Вы должны быть в состоянии определить их. Единственное, что имеет значение, это изменение определения getString(): обратите внимание на аргумент len, определяющий размер буфера char *.

#include <stdio.h> 

#define MAX_LEN 8 
#define STRING_LEN 6 

int getString(char *str, int len) 
{ 
     int n_read = 0; 
     int c; 
     int m_len = MAX_LEN; 

     if (len < m_len) m_len = len; 

     printf("\nEnter a string of length < %d: ", MAX_LEN); 

     while ((n_read < len) && (c = getc(stdin)) && c!= EOF && c!='\n') { 
       if (n_read < m_len-1) { 
         str[n_read++] = c; 
       } 
     } 
     str[n_read] = '\0'; 

     return n_read; 
} 

int main(int argc, char **argv) 
{ 
     char str1[STRING_LEN]; 
     char str2[STRING_LEN]; 

     getString(str1, STRING_LEN); 
     getString(str2, STRING_LEN); 

     fprintf(stdout, "%s\n", str1); 
     fprintf(stdout, "%s\n", str2); 

     return 0; 
} 
+0

Thats, похоже, работает с моими начальными испытаниями Rob ..... спасибо за ответ – codingfreak

0

С ответами, полученными от «Rob Jones» и «Джон Боде» Я придумал промежуточное решение.

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

#define BUF_SIZE 6 
#define STRING_SIZE 4 

/* 
* void getStringStdin(char *, int , int); 
* 
* 1: BUF  :Pointer to the array of characters where input string is to be stored. 
* 2: BUF_LEN :Is the length of the rray of characters where the string is stored.buffer where we save the string. 
* 3: STRING_LEN :Is the length of the string. 
* 
* NOTE: STRING_LEN < BUF_LEN 
* 
*/ 

getStringStdin(char *buf, int buf_len, int str_len) 
{ 

    int ch; 
    char *s; 
    int len; 

    if(str_len>=buf_len) 
    len=buf_len-1; 
    else 
    len=str_len; 

    printf ("\nEnter string of length %d(Remaining part is ignored) : ",len); 

    if((fgets(buf, len+1, stdin)) != NULL) 
    { 
    s=my_strchr(buf,'\n'); 

    if(s!=NULL) 
    { 
     *s='\0'; 
    } 
    else 
    { 
     while ((ch = getchar()) != '\n' && ch != EOF); 
    } 
    } 
} 


    int main(void) 
    { 
     int i=0; 
     char buf[BUF_SIZE]; 

     do 
     { 
      getString(buf, BUF_SIZE, STRING_SIZE); 
      printf ("\nString : %s\n", buf); 
      i++; 
     }while(i<2); 

     return 0; 
    } 
+0

Что произойдет, если STRING_SIZE больше BUF_SIZE? Аргумент 'len' должен использоваться для указания длины (размера) параметра buf для getString(). Попробуйте сделать STRING_SIZE '7' и введите семь или более символов. –

+0

Приятный вход Rob Jones, поэтому я сделал изменения кода соответственно – codingfreak

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