2014-01-10 135 views
3

我正在使用this SO question作为需要反转字符串的程序的一部分。我遇到的问题是,我似乎无法获得该功能的工作。这里是我的代码有:'reverse_string'函数的冲突类型

int main(int argc, char *argv[]){ 
    char *test = "Testing"; 
    fputs(test, stdout); 
    fputs(reverse_string(test), stdout); 
} 

char* reverse_string(char *str){ 
    char temp; 
    size_t len = strlen(str) - 1; 
    size_t i; 
    size_t k = len; 
    for(i = 0; i < (len +1)/2; i++){ 
    temp = str[k]; 
    str[k] = str[i]; 
    str[i] = temp; 
    k--; 
    } 
    return str; 
} 

我得到一个错误,有conflicting types for 'reverse_string'

编辑:对于任何人在这里不知道的是,工作的代码。请参阅@ chux的解答。

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
char* reverse_string(char *str){ 
    char temp; 
    size_t len = strlen(str) - 1; 
    size_t i; 
    size_t k = len; 
    for(i = 0; i < (len +1)/2; i++){ 
    temp = str[k]; 
    str[k] = str[i]; 
    str[i] = temp; 
    k--; 
    } 
    return str; 
} 
int main(int argc, char *argv[]){ 
    char test[] = "Testing"; 
    fputs(test, stdout); 
    fputs(reverse_string(test), stdout); 
} 
+2

您可能需要将reverse_string放在main之上或声明它。编译器可能会假设一些关于这个函数的东西。 –

+0

如果我运行的是同上面main声明的reverse_string程序,我仍然会遇到分段错误。 –

+1

@DannyDyla作为chux和我在他的回答中提到,你不能修改字符串文字。 –

回答

6

你不能传递一个const char *char *

char *test = "Testing"; 
fputs(reverse_string(test), ... // bad, attempting to change constant data. 
// bad as reverse_string() is assumed to return int, but fputs() expects char * 

char* reverse_string(char *str) { // Bad, there's now a function conflict 

相反

char* reverse_string(char *str); // Need to declare/define function first 

char test[] = "Testing"; 
fputs(reverse_string(test), ... // good 

[编辑]
您的问题以及被鉴定(缺少函数声明)别人。我的建议照顾下一个问题。在C中,函数的缺失声明将假定为int reverse_string(...),其不匹配char* reverse_string(char *str)

[编辑]
作为@Shafik Yaghmou表明,修改字符串文字char *test = "Testing"将导致未定义的行为。因此char test[] = "Testing"初始化test与“测试\ 0”,但可能会被修改。

[编辑]
@GreenAsJade正确地指出OP的原始错误信息是由于假定int reverse_string(...)int fputs(const char * s, FILE * stream);

char *test1 = "Testing"供给ints是不一样的东西char test2[] = "Testing"test1与指针的大小成为char *。初始指针值是位于内存中其他位置的字符串“测试”。 test2是一个大小为8的char数组:长度为“测试”+ 1代表'\ 0'。该阵列test2被初始化为 'T', 'E',...... '\ 0' 等

+1

+1你还应该提到forward forward'reverse_string',并提到修改一个字符串文字是未定义的将会很有帮助。 –

+0

您的回答惊讶于我。我仍然不明智,因为你的第一个代码块编译得很好(在main()中放入reverse_string(test)之后)。我认为现在删除的关于预先声明的答案是正确的答案! – GreenAsJade

+1

我的印象是:char * test =“Testing”'和'char test [] =“Testing”'是一回事。这不正确吗? –

1

FWIW:

(h2hh)momerath:Documents mgregory$ cat test.c 
char* reverse_string(char *str) { 
    return str; 
} 

char *test = "Testing"; 

int main() { 

    reverse_string(test); 
} 
(h2hh)momerath:Documents mgregory$ gcc test.c 
(h2hh)momerath:Documents mgregory$ 

我认为答案OP的问题是reverse_string已到在被使用之前被声明,不是int。

+1

感谢您的输入 - 作为另一个,现在删除,答案出现了,我也看到了额外的代码问题。 – chux