C/C++语言连续读入一组字符串

本文探讨了C风格字符串的输入方法,包括使用%s和%c格式读取单个及多个字符串的问题解决策略,以及利用C++风格字符串结合容器进行高效输入与处理的技术实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

C++中,有多种方法可以读取一行字符串。以下是三种常见的方法: 方法一:使用getline函数 可以使用getline函数从标准输入流中读取一行字符串。例如,可以使用以下代码读取一行字符串并输出: ```cpp #include <iostream> #include <string> using namespace std; int main() { string str; getline(cin, str); cout << str << endl; return 0; } ``` \[3\] 方法二:使用cin.get函数 可以使用cin.get函数从标准输入流中读取一行字符串。需要注意的是,cin.get函数不会删除换行符,可能会影响下一次读入。例如,可以使用以下代码读取一行字符串并输出: ```cpp #include <iostream> #include <cstring> using namespace std; int main() { char a\[105\]; cin.get(a, 105); cout << strlen(a) << endl; return 0; } ``` \[2\] 方法三:使用cin和getline组合 如果在使用cin读取其他数据类型后,再使用getline读取一行字符串,需要注意cin会读取上一行的结束符,导致getline读取到空字符串。可以使用以下代码读取一行字符串并输出: ```cpp #include <iostream> #include <string> using namespace std; int main() { int n; cin >> n; string s; getline(cin, s); // 消除n后面的回车符 for (int i = 0; i < n; i++) { string s; getline(cin, s); cout << s << endl; } return 0; } ``` \[1\] 以上是三种常见的C++字符串读入一行的方法。具体使用哪种方法取决于你的需求和代码结构。 #### 引用[.reference_title] - *1* [C++关于字符串读入操作](https://blog.youkuaiyun.com/weixin_43917370/article/details/120607709)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++ 字符串读入方式](https://blog.youkuaiyun.com/guobingk/article/details/114552984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++ 每次读取一行字符串输入](https://blog.youkuaiyun.com/lwgkzl/article/details/53232889)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值