【问题标题】:Conflicting types for 'reverse_string' function“reverse_string”函数的冲突类型
【发布时间】:2014-01-10 03:29:15
【问题描述】:

我在需要反转字符串的程序中使用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);
}

【问题讨论】:

  • 您可能需要将 reverse_string 放在 main 之上或声明它。编译器可能假设了一些关于函数的事情。
  • 如果我在 main 上面声明的 reverse_string 运行相同的程序,我仍然会遇到分段错误。
  • @DannyDyla as chux 我在他的回答中提到,您不能修改字符串文字。

标签: c string


【解决方案1】:

您不能将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

[编辑]
您的问题已被其他人很好地识别(缺少函数声明)。我的建议解决了 next 问题。在 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 fputs(const char * s, FILE * stream); 中向 s 提供了 int

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

【讨论】:

  • +1 您还应该提及前向声明 reverse_string 并提及修改字符串文字未定义会有所帮助。
  • 你的回答让我吃惊。我仍然不明智,因为您的第一个代码块编译得很好(在您将 reverse_string(test) 调用放入 main() 之后)。我认为现在删除的关于预先声明的答案是正确的答案!
  • 我的印象是char *test = "Testing" 和char test[] = "Testing" 是一回事。这不是真的吗?
  • 我也在想同样的事情。我没有意识到 c 对 constness 如此挑剔......我曾认为这更像是 C++ 的事情。不过,我已经很久没有接触过 c 编程了! (这就是我喜欢阅读这些内容的原因!)
  • @DannyDyla 请看我对Difference between array and pointer to string literal的回答。
【解决方案2】:

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。

【讨论】:

  • 感谢您的输入 - 当另一个已删除的答案出现时,我也看到了其他代码问题。
猜你喜欢
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
相关资源
最近更新 更多