为什么我在这里收到 "format '%s' expects argument of type 'char *' but...." 错误?

Why am I getting the "format '%s' expects argument of type 'char *' but...." error here?

我对 C 还很陌生,但仍在掌握基础知识。我正在写一个非常简单的练习,它使用一个短语并将其反转。我确定此代码还有其他问题,但主要是关于 main.c 的编译,我不断收到错误

main.c:14:9: 警告:格式“%s”需要 char* 类型的参数,但参数 2 的类型为 'int' 命令未找到

我不知道为什么会出现该错误,有人可以帮助我理解为什么吗?谢谢!

我的main.c

int main (int argc, char * argv [])
{

char word[] = "Happy Birthday!";

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

system ("Pause");
return 0;
}

我的reverse.c

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

char *reverse(char *word)
{
char *rev;
char *i;
char temp;

rev = word;
for (i = word; *i != '[=12=]'; i++)
{
        if (i - word > 1)
                for (i--; word < i; word++, i--)
                {
                        temp = *word;
                        *word = *i;
                        *i = temp;
                }

return rev;
}

如果那是你的整个 main.c 源文件,那么编译器不会看到你的 reverse 函数的声明。

在 C89/C90 中,对未声明函数的调用将创建该函数的隐式声明,返回类型 int 的结果。如果函数实际上 returns 不是 int,就像你的那样,那么行为是未定义的。

C99 放弃了此 "implicit int" 规则,使对未声明函数的任何调用都成为 约束违规 ,需要进行诊断。您应该找出如何让您的编译器诊断此类调用。

解决方法是使 reverse 的声明在 main.c 中可见。最好的方法是创建一个 header 文件,很可能是 reverse.h,其中包含声明:

#ifndef REVERSE_H
#define REVERSE_H

char *reverse(char *word);

#endif

#include 即 header 在 main.creverse.c 中。 (将它包含在 main.c 中提供了声明,因此可以正确编译调用。将它包含在 reverse.c 中可以让编译器确认声明和定义是一致的。)

由于您没有在 main.c 文件(模块)中包含 reverse() 函数的声明,编译器(抑制了适当的警告标志)假设它 returns int.

所以包括声明

char *reverse(char *word);

在您的 main.c 文件的开头。

问题是反向函数的类型。这是一个替代代码:

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

void reverse(char *word)
{
    size_t i;
    size_t length = strlen(word);
    size_t tmp;
    for (i = 0; i < (length / 2); i++) {
        tmp = length-i-1;
        /* This is a xor swap. */
        word[i] ^= word[tmp];
        word[tmp] ^= word[i];
        word[i] ^= word[tmp];
    }
}

int main (int argc, char * argv [])
{
    char word[] = "Happy Birthday!";
    printf("%s\n", word);
    reverse(word);
    printf("%s\n", word);
    reverse(word);
    printf("%s\n", word);
    printf("%s\n", word);
    system ("Pause");
    return 0;
}

证明如下: Run code