2015-11-06 106 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