【问题标题】:Function returns Int rather than char函数返回 Int 而不是 char
【发布时间】:2015-03-03 17:28:35
【问题描述】:

我正在编写一些练习程序,但在下面的函数挤压中遇到了问题。它按预期返回整数而不是 char 数组。该代码意味着用户首先输入一个字符串,然后输入一个他希望删除的字符。 squeez 函数接收两者并输出一个没有给定字符的字符串。

目前我的函数给出警告:
return 从没有强制转换的指针中生成整数 [默认启用]

我知道函数返回类型 'int' b/c 它也显示第二个错误:
格式“%s”需要“char *”类型的参数,但参数 2 的类型为“int”[-Wformat=]

/* Squeeze Function */

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

char squeez(char s[], int c)
{
    int i, j;

    for (i = j = 0; s[i] != '\0'; i++)
    {
        if (s[i] != c)
        {
            s[j++] = s[i];
        }
    printf("%c %d", s[i], c);
    }
    printf("%s", s);
    s[j] = '\0';
    return s;
}

int main(void)
{
    int i, c;
    char str[10];

    for (i = 0; (c = getchar()) != '\n'; ++i)
    {
        str[i] = c;
    } 
    c = getchar();
    printf("%s", squeez(str, c));
    return EXIT_SUCCESS;
}

感谢您的任何帮助!

【问题讨论】:

    标签: c function return-value


    【解决方案1】:

    您应该将返回类型更改为char *

    char *squeez(char s[], int c) {
        …
        return s;
    }
    

    …因为s是一个指针(字符串第一个字符的地址)。


    第二个问题是squeez() 寻找一个'\0' 终结符,但你从来没有在那里写过。第三个问题是您可能会溢出 10 字节缓冲区。 main() 中的循环应该更像

    #include <assert.h>
    
    int main(void)
    {
        int i;
        char str[10];
    
        for (i = 0; i < sizeof(str) - 1; i++)
        {
            if ((str[i] = getchar()) == '\n')
            {
                break;
            }
        }
        assert( (i == sizeof(str) - 1) || (str[i] == '\n') );
        str[i] = '\0';
        printf("%s", squeez(str, getchar()));
    }
    

    【讨论】:

    • 你能简单解释一下区别吗?
    • 当您说 return s 时,编译器将返回指向字符串 s 的指针,而不是字符串本身。但是您的函数期望返回类型为 char,因此它将 char 指针转换为 char。更改返回类型将解决问题。
    【解决方案2】:

    您实际上是在返回一个 char 指针。所以函数的返回类型应该是char *

    【讨论】:

      【解决方案3】:

      你必须返回字符指针。将返回的char 更改为char *

      如果您使用的是字符,那么它将被视为单个字符。因此,当您使用 char 时,您只能返回字符。像这样。

      return s[0]; or else a character variable.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-28
        • 1970-01-01
        • 2021-07-19
        • 2023-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        相关资源
        最近更新 更多