在c中使用指针反转字符串
这是一个程序,以扭转字符串,但它给出了一些错误,可能是由于 最后是printf语句。请帮忙纠正这个错误 我是指针新手,所以请告诉我指针到数组的转换是否正确在c中使用指针反转字符串,c,string,runtime-error,C,String,Runtime Error,这是一个程序,以扭转字符串,但它给出了一些错误,可能是由于 最后是printf语句。请帮忙纠正这个错误 我是指针新手,所以请告诉我指针到数组的转换是否正确 void reverse(char *a) { char *b; int j=0; int l=strlen(a); l--; while(l>=0) { b[j]=a[l]; l--;j++; } b[j]='\0'; p
void reverse(char *a)
{ char *b;
int j=0;
int l=strlen(a);
l--;
while(l>=0)
{ b[j]=a[l];
l--;j++;
}
b[j]='\0';
printf("%s",b);
}
您从未为指针b分配过任何内存。您必须将此指针指向一个足够大的内存,以容纳要复制到其中的字符串。请注意,这会导致未定义的行为,因此在某些情况下,它甚至可能看起来有效,但不能保证有效
您可以将指针指向本地数组,或者使用malloc为其分配内存。前者更可取,尤其是因为您从未实际从函数返回任何内容。您只需要函数本地的字符串
您从未为指针b分配过任何内存。您必须将此指针指向一个足够大的内存,以容纳要复制到其中的字符串。请注意,这会导致未定义的行为,因此在某些情况下,它甚至可能看起来有效,但不能保证有效
您可以将指针指向本地数组,或者使用malloc为其分配内存。前者更可取,尤其是因为您从未实际从函数返回任何内容。您只需要函数本地的字符串。根据是否修改传递到函数中的字符串,有几种方法可以实现反转 如果唯一的目的是按相反顺序打印字符串,而不是更改存储,则可以使用:
void print_reverse_string(const char *str)
{
const char *src = str + strlen(str);
while (src > str)
putchar(*--src);
}
void reverse_string_and_print(char *str)
{
if (*str == '\0')
return;
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
printf("%s", str);
}
如果目标是反转存储中的字符串并打印它,则可以使用:
void print_reverse_string(const char *str)
{
const char *src = str + strlen(str);
while (src > str)
putchar(*--src);
}
void reverse_string_and_print(char *str)
{
if (*str == '\0')
return;
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
printf("%s", str);
}
第二个函数设计得很糟糕,因为它有两个功能。最好有一个void reversechar*str函数,它可以在原地反转字符串,然后从调用代码打印它
void reverse(char *str)
{
if (*src == '\0')
return;
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
}
这可以声称是一个通用函数,其方式是reverse_string_和_print无法实现的
请注意,对空字符串的测试可以避免在end表达式中减去1时出现未定义的行为。受伤的几率很小,但应该始终避免UB
SSCCE
根据是否要修改传递到函数中的字符串,有几种实现反转的方法 如果唯一的目的是按相反顺序打印字符串,而不是更改存储,则可以使用:
void print_reverse_string(const char *str)
{
const char *src = str + strlen(str);
while (src > str)
putchar(*--src);
}
void reverse_string_and_print(char *str)
{
if (*str == '\0')
return;
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
printf("%s", str);
}
如果目标是反转存储中的字符串并打印它,则可以使用:
void print_reverse_string(const char *str)
{
const char *src = str + strlen(str);
while (src > str)
putchar(*--src);
}
void reverse_string_and_print(char *str)
{
if (*str == '\0')
return;
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
printf("%s", str);
}
第二个函数设计得很糟糕,因为它有两个功能。最好有一个void reversechar*str函数,它可以在原地反转字符串,然后从调用代码打印它
void reverse(char *str)
{
if (*src == '\0')
return;
char *src = str;
char *end = src + strlen(src) - 1;
while (end > src)
{
char t = *end;
*end-- = *src;
*src++ = t;
}
}
这可以声称是一个通用函数,其方式是reverse_string_和_print无法实现的
请注意,对空字符串的测试可以避免在end表达式中减去1时出现未定义的行为。受伤的几率很小,但应该始终避免UB
SSCCE
假设输入是非常量的,您可以在不需要辅助存储的情况下就地执行字符串反转。如果不修改字符串,则参数将为const char*a,函数名将为print\u reversed\u stringconst char*a或其他。在C99中,可以使用char b[strlena+1];要分配VLA-可变长度数组,请执行以下操作:char*b=char*mallocsize;?这是初始化指针b的正确实现吗?Alok SaveNot sizeofa;斯特莱纳+1@JonathanLeffler是的,感谢它现在正在运行..用字符b[strlena+1]分配数组有什么区别;使用charb=charmallocsize的a+1?后一个实现在这里是无效的吗?sizeofa给出了指针a的大小,这不是您真正想要的。您需要的是字符串的大小,即字符串的长度+1个空终止符的额外空间,所以strena+1若输入是非常量的,您可以在不需要辅助存储的情况下就地执行字符串反转。如果不修改字符串,则参数将为const char*a,函数名将为print\u reversed\u stringconst char*a或其他。在C99中,可以使用char b[strlena+1];要分配VLA-可变长度数组,请执行以下操作:char*b=char*mallocsize;?这是初始化指针b的正确实现吗?Alok SaveNot sizeofa;斯特莱纳+1@JonathanLeffler是的,感谢它现在正在运行..用字符b[strlena+1]分配数组有什么区别;使用charb=charmallocsize的a+1?后一个实现在这里是无效的吗?sizeofa给出了指针a的大小,这不是您真正想要的。您需要的是字符串的大小,即字符串的长度+1个空终止符的额外空间,所以strena+1个字符!这很有见地。虽然我仍然怀疑char*b=char*malloc sizeofchar*strlena+1;和字符b[strlena+1];哪一个是赌注
初始化以及在哪些情况下?如果您使用malloc,您必须知道在哪里免费进行匹配。如果您使用C99 VLA,您不必担心释放空间。如果要从函数char*reverseconst char*str返回字符串,则必须使用malloc,因为无法返回指向本地字符串的指针,但调用代码必须免费调用。谢谢!这很有见地。虽然我仍然怀疑char*b=char*malloc sizeofchar*strlena+1;和字符b[strlena+1];哪种初始化更好?在哪种情况下?如果使用malloc,您必须知道在哪里免费进行匹配。如果您使用C99 VLA,您不必担心释放空间。如果要从函数char*reverseconst char*str返回字符串,则必须使用malloc,因为不能返回指向本地字符串的指针,但调用代码必须调用free。