Как прочитать строку длины 'n' из стандартного ввода - PullRequest
1 голос
/ 27 августа 2009

Я хотел бы знать, как читать строку из стандартного ввода длины '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

Ответы [ 5 ]

3 голосов
/ 27 августа 2009

Одной из стратегий является проверка вашей строки на наличие новой строки; если вы его не найдете, то ваш пользователь потенциально ввел строку, которая слишком длинна для целевого буфера. В этом случае вы можете повторно вызывать функцию 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
   */
}
1 голос
/ 27 августа 2009

Используйте getch в цикле.

1 голос
/ 27 августа 2009

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

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

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

0 голосов
/ 28 августа 2009

С ответами " Роб Джонс " и " Джон Боде " я нашел промежуточное решение.

#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 голосов
/ 28 августа 2009

Сделайте это, используя getc () вместо gets (). Я провел небольшое быстрое тестирование на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...