为什么我会得到"格式'%s'期望参数类型' char *'但...."错误在这里?

时间:2017-05-30 19:19:49

标签: c reverse

我对C很陌生,并且仍然抓住基础知识。我正在写一个非常简单的练习练习,它会用一个短语来反转它。我确定这段代码还有其他问题,但主要是编译main.c,我不断收到错误

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

我不知道为什么会收到这个错误,有人可以帮我理解原因吗?谢谢!

我的main.c

3   4   5   4
4   5   6   5
4   -10 6   5

我的反向。

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;
}

3 个答案:

答案 0 :(得分:4)

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

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

C99放弃了这个"隐含的int"规则,对未声明的函数进行任何调用约束违规,需要诊断。您应该了解如何哄骗编译器来诊断此类呼叫。

修复方法是在reverse中显示main.c的声明。最好的方法是创建一个包含声明的头文件,最有可能是reverse.h

#ifndef REVERSE_H
#define REVERSE_H

char *reverse(char *word);

#endif

#include main.creverse.c中的标头。 (在main.c中包含它提供了声明,因此可以正确编译调用。将它包含在reverse.c中可以使编译器符合声明和定义的一致性。)

答案 1 :(得分:1)

由于您没有在reverse()文件(模块)中包含main.c函数的声明,因此编译器(具有被抑制的适当警告标志)假设它返回int。< / p>

所以包括声明

char *reverse(char *word);

main.c文件的开头。

答案 2 :(得分:0)

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

#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