'reverse_string'函数的冲突类型

时间:2014-01-10 03:29:15

标签: c string

我使用this SO question作为需要反转字符串的程序的一部分。我遇到的问题是我似乎无法使功能发挥作用。这是我的代码:

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 个答案:

答案 0 :(得分: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"使用“Testing \ 0”初始化test,但可能会被修改。

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

char *test1 = "Testing"char test2[] = "Testing"不同。 test1变为char *,其大小为指针。初始指针值是位于内存中其他位置的字符串“Testing”。 test2char数组,大小为8:长度为“测试”+ 1为“\ 0”。数组test2初始化为'T','e',...'\ 0'等。

答案 1 :(得分: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。