C 为什么我会得到“一个”;格式';%s';应为类型为';字符*';但是……”;这里有错误吗?
我对C语言还不太熟悉,仍然掌握着基本的知识。我正在写一个非常简单的练习题,用一个短语并将其颠倒过来。我确信这个代码还有其他问题,但是主要是在main.c的编译上,我不断地得到错误 main.c:14:9:警告:格式'%s'要求参数的类型为char*,但参数2的类型为'int'命令找不到 我不知道我为什么会犯这样的错误,有人能帮我理解为什么吗?谢谢大家! 我的主要工作C 为什么我会得到“一个”;格式';%s';应为类型为';字符*';但是……”;这里有错误吗?,c,reverse,C,Reverse,我对C语言还不太熟悉,仍然掌握着基本的知识。我正在写一个非常简单的练习题,用一个短语并将其颠倒过来。我确信这个代码还有其他问题,但是主要是在main.c的编译上,我不断地得到错误 main.c:14:9:警告:格式'%s'要求参数的类型为char*,但参数2的类型为'int'命令找不到 我不知道我为什么会犯这样的错误,有人能帮我理解为什么吗?谢谢大家! 我的主要工作 int main (int argc, char * argv []) { char word[] = "Happy Birth
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;
}
我的反面
#include<stdio.h>
#include<string.h>
char *reverse(char *word)
{
char *rev;
char *i;
char temp;
rev = word;
for (i = word; *i != '\0'; i++)
{
if (i - word > 1)
for (i--; word < i; word++, i--)
{
temp = *word;
*word = *i;
*i = temp;
}
return rev;
}
#包括
#包括
字符*反向(字符*字)
{
字符*rev;
char*i;
焦炭温度;
rev=单词;
for(i=word;*i!='\0';i++)
{
如果(i-word>1)
对于(i--;word
如果这是整个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
和
#在main.c
和reverse.c
中都包含该头(在main.c
中包含它提供声明,以便正确编译调用。在reverse.c
中包含它可以让编译器确认声明和定义是一致的。)如果这是整个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
和#在main.c
和reverse.c
中都包含该头(在main.c
中包含它提供声明,以便正确编译调用。在reverse.c
中包含它可以让编译器确认声明和定义是一致的。)由于您没有在main.c
文件(模块)中包含reverse()
函数的声明,编译器(带有抑制的适当警告标志)假设它返回int
因此,包括声明
char *reverse(char *word);
在main.c
文件的开头。由于未在main.c
文件(模块)中包含reverse()
函数的声明,编译器(带有相应的被抑制的警告标志)假设它返回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;
}
#包括
#包括
无效反向(字符*字)
{
尺寸i;
长度=strlen(字);
规模(tmp);;
对于(i=0;i<(长度/2);i++){
tmp=长度-i-1;
/*这是一个异或交换*/
单词[i]^=单词[tmp];
单词[tmp]^=单词[i];
单词[i]^=单词[tmp];
}
}
int main(int argc,char*argv[])
{
char word[]=“生日快乐!”;
printf(“%s\n”,word);
反面(字);
printf(“%s\n”,word);
反面(字);
printf(“%s\n”,word);
printf(“%s\n”,word);
系统(“暂停”);
返回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;
}
#包括
#包括
无效反向(字符*字)
{
尺寸i;
长度=strlen(字);
规模(tmp);;
对于(i=0;i<(长度/2);i++){
tmp=长度-i-1;
/*这是一个异或交换*/
单词[i]^=单词[tmp];
单词[tmp]^=单词[i];
单词[i]^=单词[tmp];
}
}
int main(int argc,char*argv[])
{
char word[]=“生日快乐!”;
printf(“%s\n”,word);
反面(字);
printf(“%s\n”,word);
反面(字);
printf(“%s\n”,word);
printf(“%s\n”,word);
系统(“暂停”);
返回0;
}
这是证据:
调用未声明的函数reverse()
时,您是否也会收到警告?您还应该收到关于函数reverse()的隐式声明的警告
。如果没有,则打开编译器的警告级别。如果在调用该函数时没有范围内原型,编译器会假定其返回类型为int
@xingreverse
在另一个单元中,最好包含#reverse.h
beforemain
调用未声明的函数是非法的。如果编译器没有就此发出警告,则该函数太旧,请升级。是否执行