2017-05-30 90 views
0

我对C很陌生,仍然追求基础知识。我正在写一个非常简单的练习练习,它需要一个短语并将其反转。我确信这段代码还有其他问题,但主要是编译main.c,我不断收到错误为什么我得到格式'%s'需要'char *'类型的参数,但是....“错误在这里?

main.c:14:9:warning:格式'%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 != '\0'; i++) 
{ 
     if (i - word > 1) 
       for (i--; word < i; word++, i--) 
       { 
         temp = *word; 
         *word = *i; 
         *i = temp; 
       } 

return rev; 
} 
+0

你也有关于调用未声明的函数警告'反向()'? – Barmar

+3

您还应该收到关于函数'reverse()'的隐式声明的警告。如果没有,那么打开编译器的警告级别。如果在调用该函数的地方没有范围内的原型,编译器会假定它的返回类型是“int”。 –

+2

@xing'reverse'在另一个单元中,最好''在'main'之前'#include“reverse.h”'' –

回答

4

如果这是你的整个main.c源文件,则编译器不看到你reverse函数的声明。

在C89/C90中,对未声明的函数的调用将创建该函数的隐式声明,返回int类型的结果。如果该函数实际上返回int以外的其他值,则该行为是未定义的。

C99删除了这个“隐含的int”规则,使得任何调用未声明的函数约束违规,需要诊断。你应该知道如何哄你的编译器来诊断这样的调用。

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

#ifndef REVERSE_H 
#define REVERSE_H 

char *reverse(char *word); 

#endif 

#include,在这两种main.creverse.c头。 (它包括在main.c提供的声明,使呼叫可以正确编译。它包括在reverse.c让编译器符合该声明和定义是一致的。)

+0

我将声明添加到main.c文件中,但仍然收到相同的错误。我意识到它更好的形式来创建一个头文件,所以我会这样做。但我假设如果将声明添加到main.c文件仍然给我相同的警告,创建标题仍然会给我警告? – Mike

+0

所以问题1修正了,我被声明为'char reverse'而不是'char * reverse'。 我已经按照你的建议设置了它,但我仍然得到了未定义的反向参考 – Mike

+1

@Mike:“undefined reference”听起来像是一个链接时错误。如何解决这个问题取决于你使用的编译器,但如果你使用gcc,最简单的方法是'gcc reverse.c main.c -o main'。或'gcc -c reverse.c; gcc -c main.c; gcc reverse.o main.o -o main'。或者任何一种变体,包括设置一个'Makefile'或等价物。 –

1

由于您没有包括您reverse()功能的声明main.c文件(模块),编译器(禁止适当的警告标志)假设它返回int

所以包括在你main.c文件的开头声明

char *reverse(char *word); 

+0

谢谢,但是我只是在我的main.c文件的开始时添加了,并且得到与以前完全相同的错误:/ – Mike

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

相关问题