C语言与c++如何输入带空格的字符串

一、C中(用scanf读入一个带空格的字符串)

样例:


 
 
  1. #include <stdio.h>
  2. int main(){
  3. char s[ 100];
  4. scanf( "%[^\n]", s ); //注意:连用时一定要加上 getchar() 吸收换行符
  5. printf( "%s\n", s );
  6. // printf("%c\n", s[2] );
  7. return 0;
  8. }

定制自己的扫描集 %[abc]、%[a-z]、%[^abc]、%[^a-z]。[ ]内是匹配的字符,^表示求反集

 

二、C中(gets函数)

可以无限读取,以回车结束读取。 
gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。gets()函数并不读取换行符’\n’,它会吧换行符替换成空字符’\0’,作为c语言字符串结束的标志。 
gets()函数经常和puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志’\n’ 
但是不推荐使用因为gets(s),(s为一个字符串)。gets没有指明读取的最大字符数。这里就会出现一个潜在的问题:gets将不停的往s中储存内容,而不管是否存储的下!gets函数不会管s的可用空间有多少。如果输入的字符串过长,会导致缓冲区溢出(buffer overflow),即多余的字符超出了指定的目标空间。gets()函数就会访问未被分配的内存空间,如果这些内存未被使用,不会立即出现问题;如果这片空间已经存有数据,就会擦除掉程序中的其他数据,会导致程序中止。 
在C11标准里,gets函数已经被正式删除了。

 

三、C中(fgets函数)

gets与gets互为兄弟。 
fgets(char buf, int bufsize, FILE stream ):。注意第二个参数bufsize,这个参数就限制了读取的字符的个数,这就可以解决gets()函数的缺陷。我们知道fgets() 函数主要用于读取文件,如果要读取键盘,则stream参数应该为stdin。需要注意的是,如果bufsize设置为n,那么fgets()函数最多读取n-1个字符,之所以用“最多”这个词是因为,如果在之前遇到了换行符”\n”,fgets函数也会返回,读取工作将会停止,而这个”\n”也会是buf字符串中最后一个有效字符(再往后就是字符串结束符”\0”了 ),只有在一种情况下,buf不会以”\n”结尾:读到文件结束符,并且文件的最后一个不是以”\n”结尾。还有就是,fgets()函数会读取换行符(这一点和gets函数不同),当读取结束后,fgets函数会为buf在末尾添加一个空字符作为字符串的结束。 
当一个字符都没有读到时,fgets函数返回NULL。

 

四、C中(fgetc函数)

getc(fin),他会读取一个打开的文件fin,读取一个字符,然后返回一个int值。为什么返回的是int而不是char呢?因为如果文件结束,fgetc将返回一个特殊标记EOF,它并不是一个char。如果把fgetc(fin)的返回值强制转换为char,将无法把特殊值的EOF和普通字符区分开。如果要从标准输入读取一个字符,可以用getchar,它等价于fget(stdin)。 
使用fgetc(fin)可以从打开的文件fin中读取一个字符。一般情况下应当再检查它不是EOF后再将其转化成char值,从标准输入读取一个字符可以用getchar,他等价于fgetc(stdin)。 
fgetc和getchar将读取“下一个字符”,因此需要知道在各种情况下,“下一个字符”是哪个。如果用“scanf()”读取整数,则要是再输入后多加了一个空格,用getchar读取到的将是这个空格;如果在输入之后紧跟着换行,则读取到的是回车符“\n”。

 

五、C++中(getline函数)

string类中的getline函数简单基本用法。


 
 
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string a;
  7. getline( cin,a);
  8. cout<<a<< endl;
  9. return 0;
  10. }

string类中的getline函数高级用法。


 
 
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. string a;
  7. char s= '0';
  8. getline( cin,a,s);
  9. cout<<a<< endl;
  10. return 0;
  11. }

此时,getline函数只会读取自己定义的字符s之前的字符,读取到s就停止读取了。

在char数组下也可以使用getline()函数简单用。


 
 
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main()
  5. {
  6. char a[ 100];
  7. cin.getline(a, sizeof(a));
  8. cout<<a<< endl;
  9. return 0;
  10. }

cin.get()的用法同上。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值