1

它是一个反转字符串的程序,但是由于最后的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);
   }
4

2 回答 2

5
char *b;

您从未为指针分配任何内存b。你必须把这个指针指向一个足够大的内存来保存你正在复制的字符串。请注意,这会导致未定义的行为,因此在某些情况下它甚至可能会起作用,但不能保证它会起作用。

您可以将指针指向本地数组或使用malloc. 前者更可取,特别是因为您实际上从未从函数返回任何内容。您只需要一个仅在函数本地的字符串。

于 2013-03-30T11:01:43.760 回答
5

有几种实现方法reverse(),具体取决于传入函数的字符串是否要修改。

如果唯一的目的是以相反的顺序打印字符串,而不是更改存储,那么您可以使用:

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 reverse(char *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_and_print()

请注意,在 for 的表达式中减去 1 时,对空字符串的测试可避免未定义行为 (UB) end。它伤害的机会很小,但应始终避免UB。


SSCCE(简短、独立、正确的示例

#include <stdio.h>
#include <string.h>

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)
{
    char *src = str;
    char *end = src + strlen(src) - 1;
    while (end > src)
    {
        char t = *end;
        *end-- = *src;
        *src++ = t;
    }
    printf("%s", str);
}

int main(void)
{
    const char fixed[] = "Hello World!";
    print_reverse_string(fixed);
    putchar('\n');
    printf("%s\n", fixed);
    char data[] = "Hello World!";
    reverse_string_and_print(data);
    putchar('\n');
    printf("%s\n", data);
    return(0);
}

示例输出

$ ./rv
!dlroW olleH
Hello World!
!dlroW olleH
!dlroW olleH
$ 
于 2013-03-30T11:26:23.287 回答