繁体   English   中英

在C中打印字符串/字符数组的反向函数

[英]Function that prints reverse of a string/char array in C

我现在对C语言还很陌生,我正在尝试一些实践以帮助我理解C的工作原理。 我唯一精通的其他语言是Java。 这是我的代码如下:

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

const char * reverse(char word[]);

const char * reverse(char word[]) {
    char reverse[sizeof(word)];
    int i, j;

    for (i = sizeof(word - 1); i <= 0; i--) {
        for (j = 0; j > sizeof(word - 1); j++) {
            reverse[i] = word[j];
        }
    }
    return reverse;
}

int main() {
    char word[100];

    printf("Enter a word: ");
    scanf("%s", word);

    printf("%s backwards is %s\n", word, reverse(word));

    return 0;
}

当用户输入单词时,程序会在我存储单词时成功打印出来,但是当我调用反向函数时,它不会返回任何内容。 它说在我的编辑器中,将返回内存堆栈的地址,而不是返回我试图在函数中创建的数组的字符串。 任何人都可以提供解释:

sizeof(word)不正确。 word数组传递给函数时,它作为指向第一个字符的指针传递,因此您要使用指针的大小(在32位或64位计算机上大概为4或8)。 通过打印出尺寸确认。 您需要使用strlen来获取字符串的长度。

代码还有其他问题。 例如,您不需要嵌套循环即可反转字符串。 而且sizeof(word-1)甚至比sizeof(word)还差。 而一个循环,它i--但相比较i<=0注定: i会不断得到较为不利。

reverse功能存在多个问题。 C与Java有很大的不同。 它简单得多,功能较少。

  1. 数组和字符串的大小不会通过您认为的参数传播。 您的sizeof将返回错误的值。
  2. reverse是使用两次的标识符(作为函数名和局部变量)。
  3. 您不能返回在堆栈上分配的变量,因为函数调用返回后,堆栈的这一部分可能会被破坏。
  4. 您不需要两个嵌套循环来反转字符串,并且逻辑也是错误的。

您可能要寻找的是标头string.h可用的strlen函数。 它会告诉您字符串的长度。 如果要以自己的方式解决它,则需要知道如何为字符串分配内存(以及如何释放它)。

如果您想要一个反转字符串的函数,则可以直接对参数word 它已经在reverse函数外部分配,因此它不会消失。

如果您只想向后输出字符串而不真正反转它,则还可以从字符串的末尾开始,在char之后输出char,以从strlen(word) - 10迭代开始。

编辑:更改了我的reverse()函数,以避免指针算术并允许word重用。

  1. 不要从函数返回const值; 无法将返回值分配给它,所以const没有任何意义。 注意:由于C和C ++类型系统之间的差异,如果希望代码也可以编译为C ++, 则应将字符串返回为const char *
  2. 作为参数传递的数组始终“衰减”到指针。
  3. 除非使用malloc()在堆上分配它,否则不能返回函数局部变量。 因此,我们需要在main()创建它,并将其作为参数传递。
  4. 由于args是指针,没有大小信息,因此我们需要告诉函数数组/字符串的大小: sizeof不起作用。
  5. 要成为有效的C字符串,指向char或数组的指针必须以字符串终止字符\\0结尾。
  6. 必须在scanf格式说明符中添加最大长度( %99s而不是普通%s字符串终止符\\0留一个空格),否则容易造成缓冲区溢出。

   #include <stdio.h>  // size_t, scanf(), printf()
   #include <string.h> // strlen()

// 1.         // 2.       // 3.                // 4.
   char *reverse(char *word, char *reversed_word, size_t size);

   char *reverse(char *word, char *reversed_word, size_t size)
   {
           size_t index = 0;

           reversed_word[size] = '\0'; // 5.

           while (size-- > index) {
                   const char temp = word[index];
                   reversed_word[index++] = word[size];
                   reversed_word[size]    = temp;
           }

           return reversed_word;
   }

   int main() {
           char word[100];
           size_t size = 0;

           printf("Enter a word: ");
           scanf("%99s", word); // 6.

           size = strlen(word);

           printf("%s backwards is %s\n", word, reverse(word, word, size));

           return 0;
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM