我想知道是否有办法输入字符串,就像我们输入cin>>a>>b;
的方式一样
我们如何使用gets
为字符串做同样的事情?
答案 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()就太复杂了吗?