C++ 读取字符串中的空格

我们知道C/C++ 语言直接用scanf 和cin 会跳过空格的读取,如果一个字符串中含有未知数量空格的话读取起来就比较费劲,下面总结了几个读入空格的方式。

1.gets():
对象为char数组。
这种用法在C++ 11以后就被移除了。 原因:该方法不会对输入数据进行长度检查,它会一直读取输入数据直到遇到换行符或文件结束符,如果输入的数据长度超过了目标缓冲区的大小,就会导致缓冲区溢出,可能覆盖其他内存区域,引发安全漏洞。

   char  c[100];
   gets(c);
   puts(c)

2.getline()
作为对于gets()的替代,可以读取一整行字符。

用法一:getline 针对string类型

/*
 getline(输入流,字符串,终止字符) 终止字符不写时默认为 '\n'。
*/   
	string a;
	getline(cin,a);
	cout<<a;

用法二:cin.getline 针对char数组类型

/*
 cin.getline(字符串,读取长度n,终止字符)  读入的实际长度为n-1, 终止字符不写时默认为 '\n'。
与之类似的还有cin.get 同样针对的是char数组
 cin.get(字符串,读取长度n)  读入的实际长度为n-1。
*/
	char a[100];
	cin.getline(a,100);
	cout<<a;

3.get_s()
对象为char数组。
由于gets_s是Visual Studio 编译器提供的安全gets函数(用于gets解决长度溢出),因此仅在该编译器环境底下可以使用。

/*
  gets_s(字符串,读取长度n)  读入的实际长度为n-1。
*/
	char a[100];
	gets_s(a,10);
	cout<<a;

4.scanf()
对象为char数组

    char str[50];
    scanf("%[^\n]",str); 
    printf("%s",str);

5.getchar()
getchar 用于读取任意的单个字符(可以读取空格和回车)非常灵活。

char c;
c=getchar();
cout<<c;

输入的字符串按空格分隔

1.流形式处理

    //需加入头文件sstream
	vector<string> a;
	string line;
	getline(cin,line);
	//将带有空格的字符串line 转化为字符
	istringstream l(line);
	string t;
	while(l>>t)
	{
		a.push_back(t);
		
	}
	for(auto p:a)
	{
		cout<<p;
	}

2.单个字符处理

	//i 用于遍历输入的所有字符串
	//j 用于遍历字符串a
	int i=0;
	char *fh=new char[10];
	//将输入的第一行字符串处理
	while(1)
	{
		//输入字符 
		char c=getchar();
		//输入回车,结束循环
		if(c=='\n')
		{
			//添加终止符
			fh[i]=0;
			i=0;
			//字符串复制到a里
			strcpy(a[j++],fh);
			break;
		}
		//输入空格  则前面数据为一个完整单词
		else if(c==' ')
		{
			//添加终止符
			fh[i]=0;
			i=0;
			//字符串复制到a里
			strcpy(a[j++],fh);
			continue;
		}
		else
		{
			fh[i++]=c;
		}
		
	}

3.stroke处理

 char s[20] = "a b c d e f";
   char* p = strtok(s, " ");
   vector<string> words;
   while(p) {
	   words.push_back(p);
	   //因为传入的参数为NULL 默认使用上一轮未
	   p = strtok(NULL, " ");
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值