我对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;
}
答案 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.c
和reverse.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