目前常用的读入字符串方法是使用cin>>a或scanf("%s",a),但因为cin和scanf()默认读到空格、\t、\n就停止,所以并不能读入带空格的字符串,这就让人在一些必须获取带空格字符串时很头大。上网查了以后发现用以下两种方法完美解决:
一、使用gets()函数
gets()可以说是一个相当强大的获取字符串函数(就目前我的认知来看==),
使用方法是 gets(数组名或指针) 成功时返回读入的字符串的指针,失败时返回NULL,因此也能用gets(str)!=NULL来完成与scanf("%s",str)!=EOF一样的功能。
gets()最大的好处是可以读入空格、\t和\n,并把\n作为结束的标志,读入到\n之前字符串
//请无视下面这段话,问题已解决,只是因为很有趣所以才保留这段话
/*(这里有存疑,参考blog上写的是“可接受回车键之前输入的所有字符,
并用'\n'替代 '\0'”,难道说是把最后的\0用\n替代?还是说把字符串中
间的\0当做\n?至少经过试验cb证明前一种说法不正确,但后一种说法很
蛋疼啊,每个字符串的截止字符不都是\0吗?姑且先持怀疑态度吧==)*/
二、将scanf("%s",str)中的%s替换为%[^\n]
参数"%[^n]"意为“一直读入,直到读到\n停止”,也就是说将默认的“读到空格、\n、\t停止”改成了“读到\n停止”,这就意味着能读入空格和\t啦!
(然而悲催的是,在cb中使用好像不能成功,程序一直读入字符串,不知道是我用错了还是怎么回事==,改天再试试)
//注意!!!以下全是现学现卖,因为还没实践所以基本是靠着自己的猜想写,很可能有差错,请谨慎阅读(最好别看==)
关于%[]的用法:
[]叫转换说明符
%[]表示仅读入[]内的字符,也就是说只要读到[]之外的字符立刻停止读入
举例:
scanf("%[123]",str);
输入1221231234123
那么在读到4时就停止读入,str接收的是122123123
而上面用的是%[^\n],^叫抑扬符,加了^后[]内的意思就恰好相反,也就是读到[]之内的字符立刻停止输入
举例:
scanf("%[^123]",str);
还是输入1221231234123,str一个字符也接收不到,因为第一字符'1'就属于"123"中的一个==
参考:
字符串处理之gets与scanf("%s")的区别 (注意这篇有个笔误,“可接受回车键之前输入的所有字符,
并用'\n'替代 '\0'”中\n和\0的位置反了,坑了我好久orz)