所以我正在研究这本书,并且我遇到了一个练习(简要地)要求我使用函数删除char数组的所有空格:void removeSpaces(char * s)
[iostream,包含cstring且定义了SIZE]
这是main():
int main() {
char a[SIZE] = "a bb ccc d";
cout << a << endl; // a bb ccc d
removeSpaces(a);
cout << a << endl; // a bb ccc d instead of abbcccd
}
这是removeSpaces():
void removeSpace(char* s) {
int size = strlen(s);
char* cpy = s; // an alias to iterate through s without moving s
char* temp = new char[size]; // this one produces the desired string
s = temp; // s points to the beginning of the desired string
while(*cpy) {
if(*cpy == ' ')
cpy++;
else
*temp++ = *cpy++;
}
cout << s << endl; // This prints out the desired result: abbcccd
}
(我选择的名字并不理想,但现在没关系。)所以我的函数基本上做了我想做的事情,除了结果在函数范围之外没有影响。我怎么能做到这一点?我错过了什么,我做错了什么?
答案 0 :(得分:1)
您的功能甚至不应该进行任何字符串复制。它应该只是进行就地替换:
void removeSpace(char* s)
{
for (char* s2 = s; *s2; ++s2) {
if (*s2 != ' ')
*s++ = *s2;
}
*s = 0;
}
甚至更为严厉:
void removeSpace(char* s)
{
char* s2 = s;
do {
if (*s2 != ' ')
*s++ = *s2;
} while (*s2++);
}
答案 1 :(得分:1)
由于您按值传递指针,因此您肯定会更改数组。显然,你要删除这样的空格:
void removeSpaces(char* s) {
*std::remove(s, s + strlen(s), ' ') = 0;
}
答案 2 :(得分:1)
您更改了s
的值,但这是一个局部变量,因此在函数外没有任何影响:
void removeSpace(char* s)
您可以将其更改为:
void removeSpace(char*& s)
这引用了传递的值。因此,更改s
将改变原始版本。不幸的是,由于您调用removeSpace()
的方式(当您传递数组时),这对您不起作用。
char a[SIZE] = "a bb ccc d";
removeSpaces(a);
您也可以更改代码:
char buffer[SIZE] = "a bb ccc d";
char* a = buffer;
removeSpaces(a);
现在上面提到的修改可以正常工作。但是你正在泄漏内存(你在removeSpace()
中动态分配永不释放的内存。解决这个问题的最好方法是使用现代C ++技术而不是编写C并用C ++编译器编译它。
一些解决方案:
答案 3 :(得分:0)
只需在函数中添加最后一行: -
strcpy(s, temp);
删除不必要的: -
s = temp;
答案 4 :(得分:0)
对removeSpaces
的调用没有任何影响,因为您正在函数中创建临时缓冲区,并在应用转换时将字符串复制到该缓冲区中。您可以通过删除临时缓冲区并仅修改字符串来解决此问题。
void removeSpaces(char* s)
{
char* cpy = s; // an alias to iterate through s without moving s
char* temp = s;
while (*cpy)
{
if (*cpy != ' ')
*temp++ = *cpy;
cpy++;
}
*temp = 0;
cout << s << endl; // This prints out the desired result: abbcccd
}
答案 5 :(得分:0)
您的函数会收到指针a的副本。更改函数中的副本不会更改调用者的原始指针。