【问题标题】:cant understand how to return string from function in C无法理解如何从 C 中的函数返回字符串
【发布时间】:2025-12-31 02:30:12
【问题描述】:
    void add()
    {    
    char name[50], surname[50], usern[50];

    int id, birth, amount;
    printf("Enter your name, surname and your year of birth:\n");
    scanf("%s %s %d", &name, &surname, &birth);
    printf("Enter your ID, username and your total amount:\n");
    scanf("%d %s %d", &id, &usern, &amount);
    const char *pass1=function(usern);  
    }

  const char *function (char usern[50])
  {
    char temp;
    int i=0;
    int j;
    j = strlen(usern) - 1;
    while (i < j) 
    {
      temp = usern[i];
      usern[i] = usern[j];
      usern[j] = temp;
      i++;
      j--;
    }
    return usern;   
  }

我从 'main' 调用 'add' 来打印这些东西,然后我调用 'function' 来返回 usern 字符串,但出现了问题。

编译时出现错误:

[警告] 初始化使指针从整数而不进行强制转换--> const char *pass1=function(usern);
[错误] 冲突的类型 'function'--> const char *function (char usern[50])

【问题讨论】:

  • 出了什么问题?你在用const char *pass1 做什么?预期的输出是什么,你得到什么输出?像“出现问题”这样的宽泛声明可能对您没有帮助。另一方面,有关问题的更多详细信息肯定会帮助您解决问题。 :)
  • 你好,警告是: [警告] 初始化使指针从整数而不进行强制转换--> const char *pass1=function(usern);和 [错误] 'function' 的类型冲突--> const char *function (char usern[50])
  • 我想通过调用这个函数('function')返回“pass1”中的字符串“usern”
  • 该错误是因为您在定义之前尝试使用function()。您可以在使用之前定义函数,或者在使用之前添加函数原型:const char* function(char usern[50]); 另请注意@Bathsheba 对可能未定义行为的回答。
  • 谢谢@Sumit Chakraborty,我忘记了定义前面的“const char *”。现在我在 add 中使用“ printf ("%s", pass1); " 并打印出我想要的内容:)

标签: c string function pointers


【解决方案1】:

您看到的错误消息是由于没有声明函数function 之前使用它的结果。所以编译器隐式声明了一个原型,int 作为function 的默认类型。但是function 的实际返回类型与隐式int 类型冲突。所以你会得到这些错误。

请注意,此隐式 int 规则不再有效,因为它自 C99 以来已被删除。在 C89/C90 中曾经是这种情况。

解决方案是为其提供原型。将其添加到源文件的顶部(如果有,则将其包含在头文件中)。:

const char *function (char *);

【讨论】:

  • 是的,我按照你的说法声明了这个函数,它可以工作,但在变量const char* function(char usern[50]); 之前没有 *
  • @sniperalex117 const char *function(char *); 等价于const char* function(char usern[50]);... 你需要明白的是usern不是function上下文中的数组;您不能将数组传递给function。但是,您可以通过传递指针来模拟传递数组。
  • @sniperalex117 const char* function(char usern[50]);const char* function(char *usern);const char* function(char *); 在函数原型中是等价的。参数名称在原型中是可选的。数组在传递给函数时衰减为指向其第一个元素的指针。因此,您在定义中将大小指定为 const char* function(char usern[50]){ ..} 的事实是无关紧要的,编译器会忽略它。所以usern实际上是function中的一个指针。
  • 另外,如果一个答案解决了你的问题,你应该接受它。
  • 哦,好吧,但是usern 是一个指针吗? pass1 被声明为指针。
【解决方案2】:

function 返回有效的生命周期与传递给它的参数usern 的生命周期相同。

这是因为没有深拷贝字符数组。

如果您尝试从add 返回pass1 并使用它,那么程序行为将是未定义,因为usern 将超出范围。

在 C 语言中通常要做的事情是 malloc 一个新字符串,返回一个指向它的指针。不要忘记在某个时候致电free

【讨论】:

  • 其实usern表示的参数是一个指针,而不是一个数组,这个指针指向的是add中声明的对象。你可以通过检查sizeof usern来证明这一点。
  • 另外,malloc 一个新的 string 一点也不正常。首先,字符串不是对象的类型,而是值的类型,malloc 分配的是对象,而不是值。更重要的是,考虑 C 中的每个标准库函数:fgets,例如,malloc 有什么用吗?不,但它会产生一个字符串,不是吗?