在很多时候,我们对需要输入的字符串的长度并不可知,一般情况下,我们都通过设定一个范围来解决。下面我总结了一下如何输入字符串而不需要限定长度的一种方法及其代码实现举例。
由于我们不知道输入的大小,所以我们采用C++中string + vector<char>的方法来实现,我们先来看下面的例子:
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
下面是我写的代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void stringFilter(vector<char> &pInputStr, long lInputLen, vector<char> &pOutputStr);
int main()
{
vector<char> pInStr;
vector<char> pOutStr;
string str;
cin>>str;
int n=str.length(); //获取输入的字符串长度
const char *TempInStr = str.c_str();//把string转换成char指针或者const char *TempInStr = str.data();
for(int i=0;i<n;i++) //将输入的字符串赋给vector变量
{
pInStr.push_back(TempInStr[i]);
}
long length = pInStr.size();
stringFilter(pInStr,length,pOutStr);
for (vector<char>::size_type ix = 0; ix != pOutStr.size(); ++ix)
{ //输出结果
cout<<pOutStr[ix];
}
system("pause");
return 0;
}
void stringFilter(vector<char> &pInputStr, long lInputLen, vector<char> &pOutputStr)
{
vector<char> pStrIn = pInputStr;
long length = lInputLen;
int a[128] = {0};
if(pInputStr.empty()|| lInputLen < 0)
return;
for(int i=0;i<length;i++)
{
if(a[pStrIn[i]] == 0)
{
pOutputStr.push_back(pStrIn[i]);
}
a[pStrIn[i]]++;
}
pOutputStr.push_back('\0');
}
在C++中string封装了字符串的操作,总结一下,把string转化为字符数组或指针有一下三种方式:
(1)c_str()
string str="hi,girls!";
(2)data()
string str="hello";
char *p=str.data();
(3)copy(p,len,start)
string str="howareyou";
char pStr[40];
str.copy(pStr,7,0); //7代表复制几个字符,0代表复制的位置
*(pStr+7)='\0'; //这里要手动加上结束符