一个改变字符串的程序(字母向后挪一位,区分大小写,如“abc”改变成“bcd”),打印出问题,应该是指针出了问题,求大神指教

时间:2022-04-12 22:33:17

#include "stdio.h"
#include "string.h"

void ChangeStr(const char *pIn,char *pOut)
{
char *newpIn = new char[strlen(pIn)+1];

if(pIn == NULL)
{
printf("Error!");
return ;
}

strcpy(newpIn,pIn);
pOut = newpIn;

while(*newpIn != '\0')
{
if((*newpIn >= 'a' && *newpIn <= 'z') || (*newpIn >= 'A' && *newpIn <= 'Z'))
{
if(*newpIn == 'z')
{
*newpIn = 'a';
}

else if(*newpIn == 'Z')
{
*newpIn = 'A';
}

else
{
*newpIn = *newpIn +1;
}
}
newpIn++;
}

//printf("%s\n",pOut);
}

int main()
{
char str[] = "hello world!";
char *pOut = new char;
ChangeStr(str,pOut);
printf("%s",pOut);
return 0;
}

14 个解决方案

#1


1.ChangeStr(const char* pIn, char** pOut)这样就好了
2.ChangeStr这个函数其实没必要分配内存,在原数组遍历一遍修改就好了

#2


void ChangeStr(const char *pIn,char *pOut)
单纯指针是取不回来值的,因为指针做参数一个名字拷贝
你要用引用
void ChangeStr(const char *pIn,char *&pOut)

#3


指针的指针,的确可以,你所说的在原数组遍历一遍修改是怎么回事,这样吗?
char str[] = "hello world!";
//char *pOut = new char;
ChangeStr(str,str);
printf("%s",str);
但是结果不对。

#4


你写的是c还是c++ c里面有new吗? 我有点忘了

#5


void ChangeStr(const char *pIn,char *pOut)
{
// int i = 0;
memcpy(pOut, pIn + 1, strlen(pIn) - 1);

pOut[strlen(pIn)-1] = *(pIn + strlen(pIn)) + 1;
}


我就比较奇怪了,我这里那里出了问题,为什么最后一个字节+1后出来是笑脸

#6



#include "stdio.h"
#include "string.h"

void ChangeStr(const char *pIn,char *&pOut)//pOut应该传引用而不是传值。。否则改变的只是指针的副本而不是指针本身。。
{
char *newpIn = new char[strlen(pIn)+1];

if(pIn == NULL)
{
printf("Error!");
return ;
}

strcpy(newpIn,pIn);
pOut = newpIn;

while(*newpIn != '\0')
{
if((*newpIn >= 'a' && *newpIn <= 'z') || (*newpIn >= 'A' && *newpIn <= 'Z'))
{
if(*newpIn == 'z')
{
*newpIn = 'a';
}

else if(*newpIn == 'Z')
{
*newpIn = 'A';
}

else
{
*newpIn = *newpIn +1;
}
}
newpIn++;
}

//printf("%s\n",pOut);
}

int main()
{
char str[] = "hello world!";
char *pOut = NULL;
ChangeStr(str,pOut);
printf("%s",pOut);
return 0;
}

#7


我觉得引用比使用二级指针要简单的多,个人观点!

#8


这不是编程珠玑里面的一个问题么...
#include <stdio.h>
#include <string.h>

void reverse(char *szstr, int istart, int iend)
{
while(istart < iend)
{
char a = szstr[istart];
szstr[istart++] = szstr[iend];
szstr[iend--] = a;
}
}

char *rorstr(char *szstr, int ilen, int imovlen)
{
imovlen = imovlen%ilen;
reverse(szstr, 0, imovlen-1);
reverse(szstr, imovlen, ilen-1);
reverse(szstr, 0, ilen-1);
return szstr;
}

int main(int argc, char* argv[])
{
char szstr[] = "hello world!";
printf("%s\n", rorstr(szstr, strlen(szstr), 1));
return 0;
}

#9


引用 7 楼 u010328107 的回复:
我觉得引用比使用二级指针要简单的多,个人观点!
引用不就是指针的另一种形式么,况且别人用你的函数,然后你是引用,肯定会引起很多不必要的问题,而传指针别人一看就知道,函数内部可能修改这么值~~~~~

#10


指针问题,
pOut = newpIn;这一句你将想将pOut(你传入的地址)改变为newpIn的地址,但是ChangeStr函数调用后,main函数里面的pOut并没有改变,之后printf显示的内容的地址仍然是你main函数里面定义pOut是的地址。
 

#include "stdio.h" 
#include "string.h"   
void ChangeStr(const char *pIn,char *pOut) 
{     
char *newpIn = new char[strlen(pIn)+1];
if(pIn == NULL)     
{         
printf("Error!");
return ;     
}       
strcpy(newpIn,pIn);
while(*newpIn != '\0')
{         
if((*newpIn >= 'a' && *newpIn <= 'z') || (*newpIn >= 'A' && *newpIn <= 'Z'))
{             
if(*newpIn == 'z') 
            {                 
*newpIn = 'a'; 
}               
else if(*newpIn == 'Z')
{
*newpIn = 'A';
}
else
            {
*newpIn = *newpIn +1;
}
}
memcpy(pOut,newpIn,1);//将传入的地址对应的内容改变
newpIn++;
pOut++;
}
memcpy(pOut,newpIn,strlen(newpIn)+1);
 }   
int main()
 {  
char str[] = "hello world!";
char *pOut = new char;
ChangeStr(str,pOut);
printf("%s\n",pOut);
return 0;
 }

#11


引用 9 楼 jha334201553 的回复:
Quote: 引用 7 楼 u010328107 的回复:

我觉得引用比使用二级指针要简单的多,个人观点!
引用不就是指针的另一种形式么,况且别人用你的函数,然后你是引用,肯定会引起很多不必要的问题,而传指针别人一看就知道,函数内部可能修改这么值~~~~~


引用 6 楼 hugett 的回复:

#include "stdio.h"
#include "string.h"

void ChangeStr(const char *pIn,char *&pOut)//pOut应该传引用而不是传值。。否则改变的只是指针的副本而不是指针本身。。
{
char *newpIn = new char[strlen(pIn)+1];

if(pIn == NULL)
{
printf("Error!");
return ;
}

strcpy(newpIn,pIn);
pOut = newpIn;

while(*newpIn != '\0')
{
if((*newpIn >= 'a' && *newpIn <= 'z') || (*newpIn >= 'A' && *newpIn <= 'Z'))
{
if(*newpIn == 'z')
{
*newpIn = 'a';
}

else if(*newpIn == 'Z')
{
*newpIn = 'A';
}

else
{
*newpIn = *newpIn +1;
}
}
newpIn++;
}

//printf("%s\n",pOut);
}

int main()
{
char str[] = "hello world!";
char *pOut = NULL;
ChangeStr(str,pOut);
printf("%s",pOut);
return 0;
}
嗯,明白了。如果使用指针的指针,是不是ChangeStr函数的形参要修改,void ChangeStr(const char *pIn,char **pOut),这样使用也要相应的修改了,ChangeStr(str,*pOut),可以不修改出入的形参格式而使用二级指针吗?

#12


程序应该是介样子的
#include "stdio.h"
#include "string.h"

void ChangeStr(const char *pIn,char **pOut)
{
char *newpIn = new char[strlen(pIn)+1];

if(pIn == NULL || newpIn == NULL)
{
printf("Error!");
return ;
}

strcpy(newpIn, pIn);
*pOut = newpIn;

do{
if( (*newpIn|0x20) >= 'a' && (*newpIn|0x20) <= 'z' )
{
(*newpIn)++;
if( (*newpIn|0x20) > 'z')
{
*newpIn -= 'z'-'a';
}
}
}while( *newpIn++ != '\0');
}

int main()
{
char str[] = "hello world!";
char *pOut;

ChangeStr(str, &pOut);

printf("%s\n", pOut);
delete []pOut;
return 0;
}

#13


请问'\xFF'这个字符怎么向后挪一位?

#14


我觉得很有必要定义newpIn,因为一般最好不要对型参pIn操作,

#1


1.ChangeStr(const char* pIn, char** pOut)这样就好了
2.ChangeStr这个函数其实没必要分配内存,在原数组遍历一遍修改就好了

#2


void ChangeStr(const char *pIn,char *pOut)
单纯指针是取不回来值的,因为指针做参数一个名字拷贝
你要用引用
void ChangeStr(const char *pIn,char *&pOut)

#3


指针的指针,的确可以,你所说的在原数组遍历一遍修改是怎么回事,这样吗?
char str[] = "hello world!";
//char *pOut = new char;
ChangeStr(str,str);
printf("%s",str);
但是结果不对。

#4


你写的是c还是c++ c里面有new吗? 我有点忘了

#5


void ChangeStr(const char *pIn,char *pOut)
{
// int i = 0;
memcpy(pOut, pIn + 1, strlen(pIn) - 1);

pOut[strlen(pIn)-1] = *(pIn + strlen(pIn)) + 1;
}


我就比较奇怪了,我这里那里出了问题,为什么最后一个字节+1后出来是笑脸

#6



#include "stdio.h"
#include "string.h"

void ChangeStr(const char *pIn,char *&pOut)//pOut应该传引用而不是传值。。否则改变的只是指针的副本而不是指针本身。。
{
char *newpIn = new char[strlen(pIn)+1];

if(pIn == NULL)
{
printf("Error!");
return ;
}

strcpy(newpIn,pIn);
pOut = newpIn;

while(*newpIn != '\0')
{
if((*newpIn >= 'a' && *newpIn <= 'z') || (*newpIn >= 'A' && *newpIn <= 'Z'))
{
if(*newpIn == 'z')
{
*newpIn = 'a';
}

else if(*newpIn == 'Z')
{
*newpIn = 'A';
}

else
{
*newpIn = *newpIn +1;
}
}
newpIn++;
}

//printf("%s\n",pOut);
}

int main()
{
char str[] = "hello world!";
char *pOut = NULL;
ChangeStr(str,pOut);
printf("%s",pOut);
return 0;
}

#7


我觉得引用比使用二级指针要简单的多,个人观点!

#8


这不是编程珠玑里面的一个问题么...
#include <stdio.h>
#include <string.h>

void reverse(char *szstr, int istart, int iend)
{
while(istart < iend)
{
char a = szstr[istart];
szstr[istart++] = szstr[iend];
szstr[iend--] = a;
}
}

char *rorstr(char *szstr, int ilen, int imovlen)
{
imovlen = imovlen%ilen;
reverse(szstr, 0, imovlen-1);
reverse(szstr, imovlen, ilen-1);
reverse(szstr, 0, ilen-1);
return szstr;
}

int main(int argc, char* argv[])
{
char szstr[] = "hello world!";
printf("%s\n", rorstr(szstr, strlen(szstr), 1));
return 0;
}

#9


引用 7 楼 u010328107 的回复:
我觉得引用比使用二级指针要简单的多,个人观点!
引用不就是指针的另一种形式么,况且别人用你的函数,然后你是引用,肯定会引起很多不必要的问题,而传指针别人一看就知道,函数内部可能修改这么值~~~~~

#10


指针问题,
pOut = newpIn;这一句你将想将pOut(你传入的地址)改变为newpIn的地址,但是ChangeStr函数调用后,main函数里面的pOut并没有改变,之后printf显示的内容的地址仍然是你main函数里面定义pOut是的地址。
 

#include "stdio.h" 
#include "string.h"   
void ChangeStr(const char *pIn,char *pOut) 
{     
char *newpIn = new char[strlen(pIn)+1];
if(pIn == NULL)     
{         
printf("Error!");
return ;     
}       
strcpy(newpIn,pIn);
while(*newpIn != '\0')
{         
if((*newpIn >= 'a' && *newpIn <= 'z') || (*newpIn >= 'A' && *newpIn <= 'Z'))
{             
if(*newpIn == 'z') 
            {                 
*newpIn = 'a'; 
}               
else if(*newpIn == 'Z')
{
*newpIn = 'A';
}
else
            {
*newpIn = *newpIn +1;
}
}
memcpy(pOut,newpIn,1);//将传入的地址对应的内容改变
newpIn++;
pOut++;
}
memcpy(pOut,newpIn,strlen(newpIn)+1);
 }   
int main()
 {  
char str[] = "hello world!";
char *pOut = new char;
ChangeStr(str,pOut);
printf("%s\n",pOut);
return 0;
 }

#11


引用 9 楼 jha334201553 的回复:
Quote: 引用 7 楼 u010328107 的回复:

我觉得引用比使用二级指针要简单的多,个人观点!
引用不就是指针的另一种形式么,况且别人用你的函数,然后你是引用,肯定会引起很多不必要的问题,而传指针别人一看就知道,函数内部可能修改这么值~~~~~


引用 6 楼 hugett 的回复:

#include "stdio.h"
#include "string.h"

void ChangeStr(const char *pIn,char *&pOut)//pOut应该传引用而不是传值。。否则改变的只是指针的副本而不是指针本身。。
{
char *newpIn = new char[strlen(pIn)+1];

if(pIn == NULL)
{
printf("Error!");
return ;
}

strcpy(newpIn,pIn);
pOut = newpIn;

while(*newpIn != '\0')
{
if((*newpIn >= 'a' && *newpIn <= 'z') || (*newpIn >= 'A' && *newpIn <= 'Z'))
{
if(*newpIn == 'z')
{
*newpIn = 'a';
}

else if(*newpIn == 'Z')
{
*newpIn = 'A';
}

else
{
*newpIn = *newpIn +1;
}
}
newpIn++;
}

//printf("%s\n",pOut);
}

int main()
{
char str[] = "hello world!";
char *pOut = NULL;
ChangeStr(str,pOut);
printf("%s",pOut);
return 0;
}
嗯,明白了。如果使用指针的指针,是不是ChangeStr函数的形参要修改,void ChangeStr(const char *pIn,char **pOut),这样使用也要相应的修改了,ChangeStr(str,*pOut),可以不修改出入的形参格式而使用二级指针吗?

#12


程序应该是介样子的
#include "stdio.h"
#include "string.h"

void ChangeStr(const char *pIn,char **pOut)
{
char *newpIn = new char[strlen(pIn)+1];

if(pIn == NULL || newpIn == NULL)
{
printf("Error!");
return ;
}

strcpy(newpIn, pIn);
*pOut = newpIn;

do{
if( (*newpIn|0x20) >= 'a' && (*newpIn|0x20) <= 'z' )
{
(*newpIn)++;
if( (*newpIn|0x20) > 'z')
{
*newpIn -= 'z'-'a';
}
}
}while( *newpIn++ != '\0');
}

int main()
{
char str[] = "hello world!";
char *pOut;

ChangeStr(str, &pOut);

printf("%s\n", pOut);
delete []pOut;
return 0;
}

#13


请问'\xFF'这个字符怎么向后挪一位?

#14


我觉得很有必要定义newpIn,因为一般最好不要对型参pIn操作,