2015-11-06 94 views
2

当我运行下面的代码,我得到的错误冲突类型错误

problem1.c:136:6: error: conflicting types for 'strcspn' 
    int strcspn(char * str, char * reject) 

我不知道为什么我收到冲突类型的错误。 这里是代码:

int strcspn(char * str, char * reject) 
{ 

    int counter = 0; 

    for (int i = 0; i < strlen(str); i ++) 
    {  for (int j = 0; j < strlen(reject); j++) 
       if (*(str + i) == *(reject + j)) 
       return counter; 
     counter++; 
    } 

return counter; 

} 


void main() 
{ 


char * str1 = (char *)malloc(sizeof(char)*100); 
char * str2 = (char *)malloc(sizeof(char)*100); 
sprintf(str1, "abc123"); 
sprintf(str2, "d2"); 
printf("%d\n", strcspn(str1, str2)); 

} 
+0

你有意重新定义一个标准的字符串库调用吗? – lurker

+1

“这里是代码:” - >还是它“这里是大部分的代码,除了'#include'文件部分”? – chux

回答

1

由于lowtech在他的回答已经说了,你应该避免重新定义的那些已经采取了C程序的函数的名称。

任何方式都有问题,你应该知道你的程序。

1)strlen的返回类型是size_t而不是int。
2)主要 应至少INT主要(无效){}
3)没有必要投 的malloc,它的返回类型为void *
4),最重要的一条,你 应该总是释放你的malloc。

到这里看看:

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int strcspn_ss(char * str, char * reject){ 
    int counter = 0; 
    size_t i,j; 

    for (i = 0; i < strlen(str); i ++){ 
     for (j = 0; j < strlen(reject); j++) 
       if (*(str + i) == *(reject + j)) 
       return counter; 
     counter++; 
    } 

    return counter; 
} 


int main (void){ 

    char * str1 = malloc(sizeof(char)*100); 
    char * str2 = malloc(sizeof(char)*100); 
    sprintf(str1, "abc123"); 
    sprintf(str2, "d2"); 
    printf("%d\n", strcspn_ss(str1, str2)); 

    free(str1); 
    free(str2); 
    return 0; 
} 

编辑: 像CAD说,在他的评论中,有你应该知道的一件重要的事情,如果你声明函数内部变量或使用参数不影响函数strcspn,请参阅以下内容:

#include<stdio.h> 

void foo(int strcspn){ 
    printf("strcspn = %d\n",strcspn); 
} 


int main (void){ 
    int strcspn = 10; 
    foo(strcspn); 
    return 0; 
} 

这是合法的。

+0

你能否澄清一下“令牌”部分? – Downvoter

+1

@cad你是什么意思? – Michi

+0

在'void foo(int strcspn){}''strcspn'不会造成伤害,尽管它是一个令牌。 – Downvoter

4

strcspn<strings.h>声明。看起来你已经包含了这个头文件,然后试着重新定义与头文件定义不同的strcspn。在我的<strings.h>它被定义为

 
size_t strcspn(const char *s, const char *reject); 
+0

@cad感谢编辑,它看​​起来更好用这种方式 – lowtech