我这里有一段代码。
void MyString::rm_left_space(char *s){
int size = getSize(s);
char s2[size];
char *s1=&s2[0];
int i=0;
while(*(s+i)==' '){
i++;
}
for (int k=i,l=0; k<size; k++) {//start from i, discarding spaces
*(s1+l) = *(s+k);
l++;
}
s=s1;
}
void MyString::rm_right_space(char *s){
int countSpacesfromLast=0;
int size = getSize(s);
int j=size-1;
while(*(s+j)==' '){
countSpacesfromLast++;
j--;
}
char *s2=new char[size-countSpacesfromLast];
for (int t=0; t<size-countSpacesfromLast; t++) {
*(s2+t)=*(s+t);
}
s=s2;
}
void MyString::rm_space(char *s){
rm_left_space(s);
rm_right_space(s);
}
如果有s = s1且s = s2,则不会发生分配。如何指针分配不起作用。
在rm_space方法中,函数调用后s没有变化。为什么呢?
答案 0 :(得分:0)
在rm_space方法中,函数调用后s没有变化。为什么呢?
因为s
是按值传递的。换句话说 - 它传递的变量s
不但是s
拥有的值。被调用函数中的变量s
和调用函数中的变量s
是两个不同的变量。因此,对其中一个进行的更改不会改变另一个。
如果要在被调用函数内的调用函数中更改s
,则需要使用call-by-reference。
类似的东西:
void MyString::rm_left_space(char*& s){
但是,请注意您的代码存在严重问题,因为您似乎正在尝试将调用函数中的s2
分配给调用函数中的s
。你永远不应该这样做,因为s2
一旦函数返回就会超出范围。
这个简单的程序使用按值传递
#include <iostream>
void foo(int x)
{
x = 42;
std::cout << "Inside foo: x=" << x << std::endl;
}
int main()
{
int x = 21;
std::cout << "Before foo: x=" << x << std::endl;
foo(x);
std::cout << "After foo: x=" << x << std::endl;
return 0;
}
输出
Before foo: x=21
Inside foo: x=42
After foo: x=21 // notice x didn't change
因为x
和foo
中的main
是两个不同的变量。
这个简单的程序使用传递引用
#include <iostream>
void foo(int& x) // Notice the &
{
x = 42;
std::cout << "Inside foo: x=" << x << std::endl;
}
int main()
{
int x = 21;
std::cout << "Before foo: x=" << x << std::endl;
foo(x);
std::cout << "After foo: x=" << x << std::endl;
return 0;
}
输出
Before foo: x=21
Inside foo: x=42
After foo: x=42 // notice that x changed
因为x
内foo
x
引用了main
中的int
这些示例使用#include <iostream>
int x = 21;
int y = 5;
void foo(int* p)
{
*p = 42;
p = &y;
std::cout << "Inside foo: p = " << p << std::endl;
std::cout << "Inside foo: *p = " << *p << std::endl;
}
int main()
{
int* p = &x;
printf("%p\n", (void*)p);
std::cout << "Before foo: p = " << p << std::endl;
std::cout << "Before foo: *p = " << *p << std::endl;
foo(p);
std::cout << "After foo : p = " << p << std::endl;
std::cout << "After foo : *p = " << *p << std::endl;
return 0;
}
,但指针完全相同。
Before foo: p = 0x60106c
Before foo: *p = 21
Inside foo: p = 0x601070
Inside foo: *p = 5
After foo : p = 0x60106c // Pointer value did NOT change
After foo : *p = 42 // Pointed to value DID change
输出:
void foo(int* p)
更换
void foo(int*& p)
与
Before foo: p = 0x60106c
Before foo: *p = 21
Inside foo: p = 0x601070
Inside foo: *p = 5
After foo : p = 0x601070 // Pointer value DID change
After foo : *p = 5 // Consequently, the pointed to value also changed
会给:
{{1}}
答案 1 :(得分:0)
我是StackOverflow的新手,如果有任何错误,请判断我
我不确定我是否误解了您的意思,所以如果有任何误解,请告诉我。
我想你想删除一个字符串中的左边空格,对吗?
e.g。
" Hello" --> "Hello"
如果是的话,这是我的版本
#include <iostream>
using namespace std;
#define SIZE 7
void rm_left_space(char* s){
int size = SIZE; //Because I don't know how to getSize, so I use fixed size instead
char s2[size];
char *s1 = &s2[0];
int i = 0;
while(*(s+i) == ' '){
i++;
}
cout << i << endl;
for (int k=i,l=0; k<size; k++) {//start from i, discarding spaces
*(s1+l) = *(s+k);
l++;
}
s=s1; // <-- Shallow copy
}
void rm_left_space_2(char* s){
int size = SIZE;
char *s2 = new char[SIZE]; <-- you should use dynamic array instead of static array
int space_num = 0;
while(*(s+space_num) == ' '){
space_num++;
}
for (int i = 0; i < SIZE; i++){
s2[i] = s[(i + space_num)%size];
}
// s = s2; // <--- shallow copy
for (int i = 0; i < SIZE; i++){ // You should copy whole array
s[i] = s2[i];
}
}
int main(){
char s[] = " hello";
cout << s << endl;
rm_left_space_2(s);
cout << s << endl;
return 0;
}
输出:
hello
hello
另外,你可以查看帖子, static array vs dynamic array in C++