C 为什么我会得到“一个”;格式';%s';应为类型为';字符*';但是……”;这里有错误吗?

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

我对C语言还不太熟悉,仍然掌握着基本的知识。我正在写一个非常简单的练习题,用一个短语并将其颠倒过来。我确信这个代码还有其他问题,但是主要是在main.c的编译上,我不断地得到错误

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

我不知道我为什么会犯这样的错误,有人能帮我理解为什么吗?谢谢大家!

我的主要工作

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
@xing
reverse
在另一个单元中,最好包含
#reverse.h
before
main
调用未声明的函数是非法的。如果编译器没有就此发出警告,则该函数太旧,请升级。是否执行