C风格字符串应该理解成最后一个元素是‘\0’的特殊字符数组。
若使用C语言连续读入一组(多个)字符串,则面临如下问题:
1 若使用“%s”格式读入,则输入过程遇到空格、table,回车后自动终止输入,无法输入空格。
2若使用“%c”格式读入,如何连续输入多个字符串?即如何实现以回车终止输入?
以“%s”格式输入字符串的实现方法类似这种情况:
//传入字符指针数组,函数完成输入字符串并将指针指向这些字符串
void cinStr(int n, char * str[]) {
int i = 0,j = 0;
char tmp[10];
for (i; i < n; ++i) {
scanf_s("%s", tmp,10);
str[i] = new char[10];
strcpy_s(str[i],strlen(tmp)+1, tmp);
}
}
以getchar()函数的实现方法类似这种情况
void cinStr(int n, char * str[]) {
int i = 0,j = 0;
char tmp[10];
for (i = 0; i < n; ++i) {
for (j = 0;; ++j) {
tmp[j] = getchar();
if (tmp[j] == '\n') {
tmp[j] = '\0';
break;
}
}
str[i] = new char[10];
strcpy_s(str[i], strlen(tmp) + 1, tmp);
}
}
C++风格字符串结合容器的实现
//C++风格字符串的实现方式
//函数cinStr完成向容器中写入字符串
void cinStr(vector<string> & m){
string mStr;
cin >> mStr;
m.push_back(mStr);
}
//函数Transfor完成从容器中取出字符串,格式化后输出
void Transform(int num, const vector<string> & str_array) {
string filename, basename, extname, tmpname;
const string defaulName("tmp");
int i = 0;
for (i = 0; i < num; ++i) {
filename = str_array[i];
int point_p = 0;
point_p = filename.find('.');
if (point_p == -1) {
basename = filename;
tmpname = basename + '.' + defaulName;
}
else {
basename = filename.substr(0, point_p);
extname = filename.substr(point_p + 1);
if (extname.empty()) {
tmpname = filename + defaulName;
}
else {
if (extname == defaulName) {
tmpname = filename.replace(point_p + 1, extname.size(), "xxx");
}
else
{
tmpname = filename.replace(point_p + 1, extname.size(), defaulName);
}
}
}
cout << str_array[i] << " -> " << tmpname << endl;
}
}
int main() {
const int nuStr = 5;
int i;
vector<string> vecStr;
for (i = 0; i < nuStr; ++i) {
cinStr(vecStr);
}
Transform(nuStr, vecStr);
return 0;
}