在C

时间:2016-09-05 19:10:30

标签: arrays string function input reverse

我现在对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;
}

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

3 个答案:

答案 0 :(得分:0)

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

代码还有其他问题。例如,您不需要嵌套循环来反转字符串。而sizeof(word-1)甚至比sizeof(word)更糟糕。而i--但比较i<=0的循环注定要失败:i会不断变得更负面。

答案 1 :(得分:0)

您的reverse功能存在多个问题。 C与Java非常不同。它更简单,功能更少。

  1. 数组和字符串的大小不会像您想象的那样通过参数传播。您的sizeof将返回错误的值。
  2. reverse是两次使用的标识符(作为函数名和局部变量)。
  3. 您不能返回在堆栈上分配的变量,因为在函数调用返回后,这部分堆栈可能会被销毁。
  4. 您不需要两个嵌套循环来反转字符串,逻辑也是错误的。
  5. 您可能寻找的是标题strlen中可用的函数string.h。它会告诉你字符串的长度。如果你想以自己的方式解决它,你将需要知道如何为字符串分配内存(以及如何释放它)。

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

    如果你只想向后输出字符串而不反转它,你也可以从字符串末尾的char之后输出char,从strlen(word) - 1迭代到0开始。

答案 2 :(得分:-1)

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

  1. 不要从函数返回const个值;无法分配返回值,因此const没有意义。警告:由于C和C ++类型系统之间存在差异,如果您希望代码也以C ++编译,将字符串返回为const char *
  2. 通过params传递的数组总是&#34;衰变&#34;指针。
  3. 除非使用malloc()在堆上分配,否则无法返回函数局部变量。所以我们需要在main()中创建它并将其作为参数传递。
  4. 由于args是指针,没有大小信息,我们需要告诉函数数组/字符串的大小:sizeof无法工作。
  5. 要成为有效的C字符串,char的指针或数组必须以字符串终止字符\0结尾。
  6. 必须将最大长度设置为scanf格式说明符(%99s而不是普通%s - 为字符串终止字符\0留一个空格,否则容易受到缓冲区溢出的影响。
  7.    #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;
       }