C++按引用传参实现移除字符串空格的代码问题咨询
问题分析与解决
问题根源
你代码里的RemoveSpaces函数虽然用了引用传参,但完全没修改传入的userString变量——它只是把非空格字符逐个打印出来,原字符串根本没被改动。主函数最后输出的还是最初输入的userInputString,所以自然会保留空格。
正确实现代码
要实现要求的功能,需要在函数里真正修改引用指向的原字符串,这里提供两种常见写法:
写法1:构建新字符串后覆盖原变量
这种方式逻辑清晰,容易理解:
#include <iostream> #include <string> using namespace std; void RemoveSpaces(string &userString) { string noSpaceStr; for (unsigned int i = 0; i < userString.size(); i++) { if (userString.at(i) != ' ') { noSpaceStr += userString.at(i); } } // 直接修改引用指向的原字符串 userString = noSpaceStr; } int main() { string userInputString; getline(cin, userInputString); RemoveSpaces(userInputString); cout << userInputString << endl; return 0; }
写法2:原地删除空格(更高效)
直接在原字符串上操作,不需要额外内存:
#include <iostream> #include <string> using namespace std; void RemoveSpaces(string &userString) { int index = 0; for (unsigned int i = 0; i < userString.size(); i++) { if (userString[i] != ' ') { userString[index++] = userString[i]; } } // 截断字符串到有效长度 userString.resize(index); } int main() { string userInputString; getline(cin, userInputString); RemoveSpaces(userInputString); cout << userInputString << endl; return 0; }
关于引用传参的关键说明
引用传参的核心是:函数里操作的就是主函数中原来的变量,而不是它的副本。但这并不意味着变量会自动更新——你必须主动对这个引用变量进行赋值、修改等操作,才能让原变量的值改变。你之前的代码只是打印字符,完全没碰userString的内容,所以原字符串当然不会变。
内容的提问来源于stack exchange,提问作者jjjzzz
相关产品推荐
相关产品推荐

