我想知道如何从长度为'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
答案 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)
确保正确分配str1
和str2
。
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;
}