我帮室友看到二级题,突然发现一个坑 记录一下
题的大概意思是,给函数传一个char指针 然后 把字符串末尾的*号去掉
比如 给的字符串是 ******aaa*******
输入******aaa
题中给定的框架是:
void func(char*string)
{
/** 写代码 **/
}
int main()
{
char str[] = "*****aaaaa****";
func(str);
printf("%s",str);
getchar();
return 0;
}
答案:
void func(char*string)
{
while (*string!='\0')
{
string++;
}
string--;
while (*string =='*')
{
string--;
}
*(string+1) = '\0';
cout <<string << endl;
}
答案很简单,问题在于,如果把main函数中的
char str[] = "*****aaaaa****";
换成
char *str ="*****aaaaa****"
;
在运行 程序直接奔溃
原因:C 语言中
- 字符串是常量,不可更改的,在func中*(string+1) = '\0';
先当与更改一个常量,导致奔溃
- 字符数组显然不是常量,故更改不会导致奔溃。它截取字符串的操作相当于用‘\0’截断了字符串
同时我有个神奇的想法,如果代码这么写
#include <iostream>
using namespace std;
void func(char*string)
{
while (*string!='\0')
{
string++;
}
string--;
while (*string =='*')
{
string--;
}
cout <<string << endl; //a
}
int main()
{
char *str= "*****aaaaa****";
func(str);
cout << str<< endl; //*****aaaaa****
getchar();
return 0;
}
在main函数中和在func函数中打印出的值为什么不同 传递的是指针哇。
想了几秒钟,突然意识到,函数传递指针只可以改变指针指向的值,并不能改变指针本身!函数传递指针离不开拷贝,只不过传递指针是去拷贝指针(即地址数据),而非拷贝值。