为什么我在这里收到 "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.c
和 reverse.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
我对 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.c
和 reverse.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