首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个看似简单但不容易做到的有关问题,处理用户输入任意长度的字符串

2012-03-31 
一个看似简单但不容易做到的问题,处理用户输入任意长度的字符串请问,标准C语言,如何处理用户输入任意长度

一个看似简单但不容易做到的问题,处理用户输入任意长度的字符串
请问,标准C语言,如何处理用户输入任意长度的字符串?

比如,用户输入一行字符串,以回车作为结束。这一行字符串中,除了控制字符和回车外,可以有任意字符,而且长度不限。但长度不会超过计算机内存的大小的。

我想,首先scanf肯定就不行,因为字符串是任意了。

其次,gets的话,需要输入一个已开辟空间的 char * 参数,但,这个空间,长度为多少?开辟为内存能容纳的最大值?太浪费了,但如果开辟小了,比如50,1024,2048,这样子又可能太小,如果用户输入1万个字符,又会溢出。

再次,如果使用getch,看似很好的做法,但如果这样,你得把文字编辑的功能全部实现,比如退格,覆盖,等,太麻烦了。


一个可行的想象的流程是:

1.清空键盘缓存区。
2.接受用户输入,放入键盘缓存区
3.用户输入回车,此时,先去掉这个回车符号,然后获取键盘缓存区的大小,这时再开辟相应大小的空间,再用gets获取。

但这个,怎么实现?有没有可行度?或者有没有别的办法?谢谢先..

[解决办法]
循环fgets即可
[解决办法]
char str[100];
while (1) {
 if (NULL==fgets(str,100,stdin)) break;
 printf("%s",str);
}
[解决办法]
一个接受用的定长buf,比如每次收1024。没收完,循环继续收。
另一个存整个字符串的str。每次收到的往这个字符串里追加。
可以参考c++里的std::string,写几个函数来实现对str的追加等操作。
[解决办法]
struct MyString
{
size_t size; // malloc出的buf大小
char *buf;
}

void add(MyString *str, char *src)
判断下 strlen(str->buf) + strlen(src) + 1的是否超过了str->size。没超过直接strcat
超过了,malloc一个新空间,把 str->buf,src的复制到新空间里,free(str->buf),str->buf指向新空间
[解决办法]
用fgets读,这个可以设置buf的长度

char *fgets( 
char *str,
int n,
FILE *stream 
);

Each of these functions returns str. NULL is returned to indicate an error or an end-of-file condition. Use feof or ferror to determine whether an error occurred. If str or stream is a null pointer, or n is less than or equal to zero, this function invokes the invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, errno is set to EINVAL and the function returns NULL.





[解决办法]
用fgets

热点排行