两只小指针 的问题

gucunlin 2010-07-22 10:22:06

char input[]="||||白天是我睡|李荣|要不然早上";
char buf[200];
char *ptemp=input;

MySubString(ptemp,buf)
if(*ptemp == '|')
ptemp++;

//问题是在MySubString里已经对ptemp++了,为什么这里的ptemp 开始位置还是input的起始位置就是“|”的位置




MySubString(ptemp,buf)
{
for(int i = 0; i < strlen(Dest); i++)
{
if(*Dest == c)
Dest++;
else
break;
}
}




...全文
108 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tst1255 2010-07-23
  • 打赏
  • 举报
回复
楼主好好理解值传递的概念啊。
hind24 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 gucunlin 的回复:]

引用 12 楼 behard 的回复:
这个就是函数调用中经常出现的问题:
传递进去的指针值被改变,其仅仅改变被调用函数中的过程中的数值
但是主函数中,之前传递进去的指针值并不会随着被调用函数的改变而改变


是呀,就是这样的? 能告诉我为什么吗?
[/Quote]c++的函数参数有传值和传引用,这种情况就是传值,实质上是在函数体内声明了一个临时变量,传进来的参数被拷贝到这个临时变量里进行处理,外面那个变量并未因此受到影响。如果想通过函数来改变这个变量,就要通过传引用、设置函数返回值、指针等方法
CppFile 2010-07-23
  • 打赏
  • 举报
回复
你出入的是一个指针型的变量,对于编译器来说,也是一个变量,他会在堆栈上开辟一个空间,然后把这只指针的值给他,所以实际上你操作的并不是同一个指针,但是指针指向的内容都是同一个

要达到你要的效果,c++里的引用操作可以达到
gucunlin 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 behard 的回复:]
这个就是函数调用中经常出现的问题:
传递进去的指针值被改变,其仅仅改变被调用函数中的过程中的数值
但是主函数中,之前传递进去的指针值并不会随着被调用函数的改变而改变
[/Quote]

是呀,就是这样的? 能告诉我为什么吗?
gucunlin 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gucunlin 的回复:]
MySubString(ptemp,buf)
{

for(int i = 0; i < strlen(Dest); i++)
{
if(*Dest == ‘|’)
Dest++;
else
break;
}
}
[/Quote]
那里看不懂呀?
gucunlin 2010-07-22
  • 打赏
  • 举报
回复
MySubString(ptemp,buf)
{

for(int i = 0; i < strlen(Dest); i++)
{
if(*Dest == ‘|’)
Dest++;
else
break;
}
}
ThinkHand 2010-07-22
  • 打赏
  • 举报
回复
看不明白的问题,给的太短的代码,猜都猜不出来。
Behard 2010-07-22
  • 打赏
  • 举报
回复
这个就是函数调用中经常出现的问题:
传递进去的指针值被改变,其仅仅改变被调用函数中的过程中的数值
但是主函数中,之前传递进去的指针值并不会随着被调用函数的改变而改变
CppFile 2010-07-22
  • 打赏
  • 举报
回复
楼主如果你跟踪一下Dest的值,你就会发现他和ptemp的值是不同的,我说的不是*Dest
所以你对Dest++只会造成Dest的增加,不会造成ptemp的增加

实际上你处理的是内容,而不是指针
jone7319 2010-07-22
  • 打赏
  • 举报
回复
char * &Dest //这个用法少见
CppFile 2010-07-22
  • 打赏
  • 举报
回复
bool MySubString(char * &Dest,char *Src)

楼主这样定义函数应该就可以有你想要的结果了
jone7319 2010-07-22
  • 打赏
  • 举报
回复

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool MySubString(char *Dest,char *Src)
{
int icount = 0;
//const char *ptemp = Dest;
char c = '|';
//memset(Src,0x00,strlen(Src));
if(Dest==NULL) return false;
while(*Dest) //改了这里
{
if(*Dest == c)
Dest++;
else
break;
}


icount = sscanf(Dest,"%[^|]",Src);
if(icount == 0) return false;

return true;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
char input[50]="|||白天是我睡|asddddddddd";
char buf[50];
char *ptemp;
ptemp = input;
char c='|';
memcpy(&buf,input,50);
while(ptemp != NULL)
{
if(MySubString(ptemp,buf)== true)
{
// printf("%s\n",buf);
ShowMessage(buf);
memset(buf,0x00,20);
if(*ptemp == '|')
++ptemp;
ptemp=strchr(ptemp,c);
}
else
break;
}


}


输出是两个:
第一个是: “白天是我睡”
第二个是:“asddddddddd”
不知是不是楼主想要的。
jone7319 2010-07-22
  • 打赏
  • 举报
回复
没看到你在MySubString(ptemp,buf)中对ptemp的操作,只是对Dest操作,请给出你的所有代码,我帮你看一下。
gucunlin 2010-07-22
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <map>
#include <string>
#include <iostream>

using namespace std;


bool MySubString(char *Dest,char *Src);
int main(int argc, char* argv[])
{
char input[50]="|||白天是我睡|asddddddddd";
char buf[50];
char *ptemp;
ptemp = input;
char c='|';
memcpy(&buf,input,50);
while(ptemp != NULL)
{
if(MySubString(ptemp,buf)== true)
{
printf("%s\n",buf);
memset(buf,0x00,20);
if(*ptemp == '|')
++ptemp;
ptemp=strchr(ptemp,c);
}
else
break;
}

return 0;
}

bool MySubString(char *Dest,char *Src)
{
int icount = 0;
//const char *ptemp = Dest;
char c = '|';
//memset(Src,0x00,strlen(Src));
if(Dest==NULL) return false;
for(int i = 0; i < strlen(Dest); i++)
{
if(*Dest == c)
Dest++;
else
break;
}


icount = sscanf(Dest,"%[^|]",Src);
if(icount == 0) return false;

return true;
}


这是一样的,在函数里已经 dest++了,函数返回后怎么还是指向开始位置那个'|'?
bbnjack 2010-07-22
  • 打赏
  • 举报
回复
....我灌水来了!!!
周药师 2010-07-22
  • 打赏
  • 举报
回复
ptemp++;

改成

++ptemp;

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧