#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.ChangeStr这个函数其实没必要分配内存,在原数组遍历一遍修改就好了
#2
void ChangeStr(const char *pIn,char *pOut)
单纯指针是取不回来值的,因为指针做参数一个名字拷贝
你要用引用
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);
但是结果不对。
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
引用不就是指针的另一种形式么,况且别人用你的函数,然后你是引用,肯定会引起很多不必要的问题,而传指针别人一看就知道,函数内部可能修改这么值~~~~~
#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;
}
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
嗯,明白了。如果使用指针的指针,是不是ChangeStr函数的形参要修改,void ChangeStr(const char *pIn,char **pOut),这样使用也要相应的修改了,ChangeStr(str,*pOut),可以不修改出入的形参格式而使用二级指针吗?
#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;
}
#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.ChangeStr这个函数其实没必要分配内存,在原数组遍历一遍修改就好了
#2
void ChangeStr(const char *pIn,char *pOut)
单纯指针是取不回来值的,因为指针做参数一个名字拷贝
你要用引用
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);
但是结果不对。
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
我觉得引用比使用二级指针要简单的多,个人观点!
#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;
}
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
引用不就是指针的另一种形式么,况且别人用你的函数,然后你是引用,肯定会引起很多不必要的问题,而传指针别人一看就知道,函数内部可能修改这么值~~~~~
我觉得引用比使用二级指针要简单的多,个人观点!
嗯,明白了。如果使用指针的指针,是不是ChangeStr函数的形参要修改,void ChangeStr(const char *pIn,char **pOut),这样使用也要相应的修改了,ChangeStr(str,*pOut),可以不修改出入的形参格式而使用二级指针吗?
#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;
}
#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操作,