将返回的cstring赋值给变量
我正在编写一个函数,它反转不在适当位置的cstring,但返回反转的cstring。返回类型应该是什么将返回的cstring赋值给变量,c,arrays,return-value,cstring,C,Arrays,Return Value,Cstring,我正在编写一个函数,它反转不在适当位置的cstring,但返回反转的cstring。返回类型应该是什么 #include <stdio.h> #include <string.h> const char* reverStr(const char *str) { char revStr[strlen(str)]; int i; for(i = strlen(str)-1; i >= 0; i--) revStr[strlen(
#include <stdio.h>
#include <string.h>
const char* reverStr(const char *str)
{
char revStr[strlen(str)];
int i;
for(i = strlen(str)-1; i >= 0; i--)
revStr[strlen(str)-1-i] = str[i];
printf("returned value should be %s\n", revStr);
return revStr;
}
int main()
{
char aStr[] = "hello";
char aStr2[] = "goodbye";
printf("%s %s", aStr, aStr2);
char* tmp = reverStr(aStr);//tmp now has garbage
printf("\n%s", tmp);
printf(" %s", aStr);
return 0;
}
#包括
#包括
常量字符*reverStr(常量字符*str)
{
char revStr[strlen(str)];
int i;
对于(i=strlen(str)-1;i>=0;i--)
revStr[strlen(str)-1-i]=str[i];
printf(“返回值应为%s\n”,revStr);
返回revStr;
}
int main()
{
char aStr[]=“你好”;
char ast2[]=“再见”;
printf(“%s%s”,应科院,应科院2);
char*tmp=reverStr(aStr);//tmp现在有垃圾
printf(“\n%s”,tmp);
printf(“%s”,应科院);
返回0;
}
给予
警告:函数返回局部变量的地址[默认启用]|
警告:初始化从指针目标类型中丢弃“const”限定符[默认情况下已启用]|
我尝试将
char*tmp
更改为char tmp[]
,但它无法编译。当我应该使用数组和指针时,我会感到困惑。revStr
是一个数组,在reverStr
函数退出后不再存在。欲了解更多信息,请阅读:
可修改的l值不能具有数组类型。l值是一个表达式,可以出现在赋值的左侧。当您想要声明许多相同类型的变量时,可以使用数组,并且可以很容易地对其进行索引,因为它的布局在某种意义上是连续的
当您希望不断更改变量指向的地址的值时,可以使用指针
您可以这样做:
char * p = "test";
p = "new";
但你不能这样做:
char p[] = "test";
char *p1 ="test1";
p = p1; //error
因为它们的(数组和指针)类型不同,并且数组p
是不可修改的l值
这是你的固定电话。我试着少做些修改。charrevstr[strlen(str)]
分配一个局部变量(数组),当您超出reverStr
函数的作用域时,它的内存被释放,这将导致进一步使用它的指针UB(大多数情况下为SEGFULT)
正确的方法是在堆上分配字符串并像下面这样返回其指针
char* x = (char*)malloc(strlen(str));
...
return x;
这需要用户负责释放内存。或者您可以为结果字符串向函数传递另一个参数。我认为您应该使用malloc分配一个新字符串
const char* reverStr(const char *str)
{
char *revStr;//using pointer
int i;
revStr = (char*)malloc(strlen(str));//dynamic allocation
for(i = strlen(str)-1; i >= 0; i--)
revStr[strlen(str)-1-i] = str[i];
printf("returned value should be %s\n", revStr);
return revStr;
}
数组是指向连续内存头的指针
例如:
int a[] = {1,2,3};
内存中的地址可能是:
-1000
{1}
-1004
二
-1008
三
-1012
1000、1004和1012是内存中地址的值
因此,数组a的值应该是1000
printf("%d",a);// Yes, you can do it and you may get the value of 1000.
此外,还可以使用以下代码
int a[] = {1,2,3};
int *b;
b= a;
printf("%d",b[1]);// you will get "2".
可以考虑指针是一个集合,数组在集合中。
因此,你不能这样做int a[] = {1,2,3};
int c = 0;
int *b = &c;
a = b;//error
除了返回一个局部变量(Acme已经解释过这一点)
char revStr[strlen(str)]
还有缺陷:终止的0
-字符总是需要空间。因此,您必须在其中放置一个+1
,并注意最后一个字符是否设置为0
@JensGustedt我同意您的推理,但通过测试,它工作正常……您很幸运,超出了数组的限制(而您的printf
就是这样做的)没有定义的行为。任何事情都有可能发生,特别是你的程序可能会崩溃。@Jens有一个很好的观点,为什么不向strlen(str)中添加+1来解释空字符,这就行了?向strlen(str)中添加+1来解释空字符
-Yeshow每次我测试它时都会出现没有垃圾显示?只是幸运?你用的是哪种编译器?我收到垃圾了↑─瓦拉ⁿ┼wç0@hello
revStr[strlen(str)]=0
相当于revStr[strlen(str)]='\0'代码>
int a[] = {1,2,3};
int c = 0;
int *b = &c;
a = b;//error