C++问题:将某一指定字符从一个已知的字符串中删除。代码如下:

#include <iostream>
#define N 80
using namespace std;
int main()
{
char str[N],x;
void del_char(char *str,char x);
cout<<"Enter a string: ";
gets(str);
cout<<"Enter the character deleted: ";
cin>>x;
del_char(str,x);
cout<<"The new string is: "<<str<<endl;
return 0;
}
void del_char(char *p,char x)
{
char *q=p;
for(;*p!='\0';p++)
if(*p!=x) *q++=*p;
*q='\0';
}
上面的代码没错,我想问几个问题。字符串的删除函数中,if语句之后*q++=*p,这里的*p是指针里的第二个值吗,for语句第一条件为空具体是怎么执行下面的内容的,请高手说明一下。还有就是主函数里的输出语句cout<<"The new string is: "<<str<<endl;这里直接输出str,但是str在函数调用中并没有改变啊,为什么指针的内容变成指针q的内容?
再问一下,这里char *q=p;如果定义指针q的时候给它赋值为其它内容行不行?不赋值p给它。

程序我运行过,可以运行但是有一些瑕疵,你的要求是“将某一指定字符从一个已知的字符串中删除”,但这个程序的缺点在于它会删除全部的指定字符,如你输入“good”,然后再输入“o”,结果是“gd”,这显然与删除一个指定字符的要求不符合。
下面是对你问题的解答:
1.字符串的删除函数中,if语句之后*q++=*p,这里的*p是指针里的第二个值吗?
答:*p是一个字符,p才是指针。
2.for语句第一条件为空具体是怎么执行下面的内容的?
答:for语句第一条件只在循环开始的时候用一次,用与给赋初值,可以省略第一条件。然后到第二条件进行判断,若第二条件为真时执行循环体里的语句,然后执行第三条件,再判断第二条件是否为真,若真继续执行循环体....以此类推
3. 还有就是主函数里的输出语句cout<<"The new string is: "<<str<<endl;这里直接输出str,但是str在函数调用中并没有改变啊,为什么指针的内容变成指针q的内容?
答:这里是输入str指针指向的地址的全部内容,str在程序开始指向内存的特定空间,里面存你的字符串,程序运行过程中,str的确没有改变,但是在调用函数的时候,同样指向这块内存地址的P和Q将这段内存地址里面的内容修改了。举个简单的例子,str是一把钥匙,可以开A号保险柜,保险柜里放的是美元,函数中传值好比用str又配了一把钥匙,我用配的钥匙把美元拿了一部分,虽然我没动str钥匙,柜子也还是那个柜子,但是美元确变化了。
希望能对你的问题有帮助
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-06
不是重复赋值,*q++=*p是在if语句判断的前提再赋值的,虽然两个指针都是指向同一个数据区域,但是默认指向的都是字符串的首地址,当q偏移地址时,p并不一定跟着一起偏移,通过if语句的判断,来去掉x这个相应的值后在加上结尾符,

for循环可以省略第一个表达式但不能省略“;”的分隔符;本回答被提问者采纳
第2个回答  2012-02-05
LZ去好好学习一下指针吧
str是字符串头本质也是指针 跟p q的性质是一样的 这三个指针指向同一个字符串 所以他们修改内容是共享的追问

谢谢,能不能帮我解释一下for语句的执行过程,特别是两个指针赋值那一部分,第一次执行时p是第几个?

追答

什么叫“第一次执行时p是第几个?”
if(*p!=x) *q++=*p; 这边就是把非x的字符复制到原字符串中 原本是x的位置就被覆盖了
比如 字符串是 abc "x"是b 那么循环的时候
1: p->a q->a
2: p->b q->b 但是这个时候q没有++
3: p->c q->b 这时候b就被c覆盖了

追问

就是字符串中的第几个字符一开始已经将p赋值给q了,接下去不是应该是p++了吗,for语句哩的*q++=*p不是重复将p赋值给q了吗,for语句第一个条件省略是怎么执行的?

相似回答