如何与gets()一起输入两个字符串;

时间:2014-02-05 04:42:13

标签: string cin gets

我想知道是否有办法输入字符串,就像我们输入cin>>a>>b;的方式一样 我们如何使用gets为字符串做同样的事情?

2 个答案:

答案 0 :(得分:2)

这已经晚了三个月,但它可能值得写,因为唯一的另一个答案是疯狂的。

首先,最重要的是,不要使用gets()。没有办法安全地使用它:它也可能被称为overrun_my_buffer_and_crash_my_program_if_I_am_lucky()。这是因为它已从最新的C标准中删除。

其次,cin >> a >> b;读取两个以空格分隔的字符串,例如句子中的两个单词。 gets()及其更安全的表兄fgets()读取整行,由换行符'\n'分隔(请注意,他们停在其他空格字符处! )。因此,复制cin的行为要困难得多 - 您必须自己完成所有解析。 (这并不是说它无法完成;如果必须在C中执行,请结帐strtok())。

cin >> a >> b;的C等效值为scanf()char a[80], b[80]; scanf("%79s %79s", a, b);但请注意,您只能读取最多固定长度的字符串(在此示例中为79个字符)。在C中安全地读取任意长度的字符串是相当复杂的;你需要以固定大小的块读取它们,并分配足够的内存来组合块。

答案 1 :(得分:-2)

如果你的输入字符串是用某种空格分隔的(即""," \ n"等等),那么它只会是:

gets(s1);
gets(s2); 

另一种方法是使用fgets(char* str, int num, FILE* stream)。它可以对str1和str2使用两次,并将从流中输入到字符串,直到读取num-1个字符或eos(" \ n"," \ t"等达到了。强烈建议使用此功能,因为它比获取更安全。

还有第三种更复杂的方法:你可以定义自己的字符串类(继承自std :: string),并在那里定义一个运算符,它代表gets()或fgets( );但是这个选项对你的情况来说真的太复杂了。

如果您需要使用一个函数,那么您可以为两个字符串创建一个重载的gets():

    void  gets(char * str1, char * str2)
{
      gets(str1);
      gets(str2);
}

使用fgets可以完成同样的技巧。但同样,对于你来说,只需要进行2次调用gets()或fgets()就太复杂了吗?