【问题标题】:error while returning a char from a function in C [closed]从C中的函数返回char时出错[关闭]
【发布时间】:2017-11-09 16:00:39
【问题描述】:
#define SIZE 1024
char encryptEVEN(char *c)
{
    int i;
    i = 0;
    char enEVEN[SIZE], temp[SIZE];
    while (/*c[i] != NULL &&*/c[i] != '\0')
    {
        if (i % 2 == 0 || i - 3 == 0)
        {
            enEVEN[i] = c[i];
            i++;
        }
    }
    strcpy(temp, enEVEN);
    return enEVEN;
}

int main()
{
    char charr[SIZE], enEVEN[SIZE];
    strcpy(enEVEN, encryptEVEN(charr));
    printf("%s", enEVEN);
}

你好, 我正在尝试在 C 中传递并返回一个字符,但我不断收到警告并且没有显示输出我认为问题在于函数的返回..我可以得到一些帮助

【问题讨论】:

  • enEVEN 是一个数组; return enEVEN; 尝试从应该返回 char 的函数返回 char *。你的编译器不高兴并不奇怪。您的代码不可读。请学会系统地缩进。请注意,将函数更改为返回 char * 不是解决方案;然后,您正在使用一个不再定义的变量,这会导致未定义的行为(也就是神秘的错误)。
  • 发布有关构建错误或警告的问题时,向我们展示! 将输出作为文本完整完整地复制,然后将其粘贴到问题正文中,不要修改。请read about how to ask good questions.
  • edit您的问题并显示一个字符串示例及其加密版本。 encryptEVEN 中的算法非常奇怪,以至于我无法猜测 encryptEVEN 应该做什么。
  • while (c[i] != '\0') { if (i % 2 == 0 || i - 3 == 0) { enEVEN[i] = c[i]; i++; } } 如果c[0] && c[1] 是一个无限循环。

标签: c arrays linux char


【解决方案1】:

你有两个主要问题:

首先是您使用了错误的返回类型。您尝试返回一个指针(指向enEVEN 的第一个元素),即char * 类型的东西。但是返回类型是char,不是指针。

更糟糕的问题是你返回了一个指向enEVEN 的第一个元素的指针,它是一个局部变量。一旦从函数返回,局部变量就会超出范围并不再存在。这意味着您要返回的指针将无效,一旦您执行了return 语句,它将指向不存在的东西。

要解决第一个问题,将返回类型更改为char *。要解决第二个问题,请将数组 enEVEN 作为 参数 传递给函数。


还有第三个问题,与上述问题无关:在main 函数中,您没有初始化charr 数组。它的内容将是不确定的(并且看似随机)。

【讨论】:

  • 如何将 enEVEN 作为参数传递?
【解决方案2】:

我不太确定,但你可能想要这个:

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

#define SIZE 1024

void encryptEVEN(const char *c, char *destination)
{
  int i = 0;
  int j = 0;

  while (c[i] != '\0')
  {
    if (i % 2 == 0 || i - 3 == 0)
    {
      destination[j++] = c[i];
    }

    i++;
  }

  destination[j] = '\0';             // string terminator
}

int main()
{
  char charr[SIZE], enEVEN[SIZE];

  strcpy(charr, "Hello World!");  // put something meaningful into the source string

  encryptEVEN(charr, enEVEN);
  printf("%s\n", enEVEN);
}

输出是:

HlloWrd

【讨论】:

    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2021-09-16
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多