Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中使用指针反转字符串_C_String_Runtime Error - Fatal编程技术网

在c中使用指针反转字符串

在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

这是一个程序,以扭转字符串,但它给出了一些错误,可能是由于 最后是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';
      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。