如何从标准输入中读取长度为'n'的字符串

时间:2009-08-27 12:49:38

标签: c

我想知道如何从长度为'n'的标准输入中读取字符串。我尝试使用fgets()函数,但如果我提交一个长度为>的字符串,则会出现问题。 Ñ

#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;
}

如果我为str1输入大于4的字符串,则其余字符将自动分配给str2。

有没有一种方法可以给str1,str2字符串提供字符串&gt; 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 个答案:

答案 0 :(得分: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
   */
}

答案 1 :(得分:1)

确保正确分配str1str2

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

另外,请注意fgets将空字符串终止,因此您实际上只会获得STRING_SIZE - 1个字符。

答案 2 :(得分:1)

循环使用getch。

答案 3 :(得分:0)

使用getc()而不是gets()来拍摄。我在OS X上做了一些快速测试。我做了一些其他的改动并不重要。你应该能够发现它们。重要的是改变getString()定义:注意指定char * buffer大小的len参数。

#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;
}

答案 4 :(得分:0)

根据“ Rob Jones ”和“ John Bode ”给出的答案,我提出了一个中间解决方案。

#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;
    }