2015-11-06 5 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 include »? – chux

ответ

1

Как lowtech уже сказал в своем ответе, вы должны избегать, чтобы переопределить имена функций в ваших программах C, которые уже приняты.

Любая проблема с вашей программой, которую вы должны знать.

1) STRLEN Возвращение тип size_t и не Int.
2) главный должен быть по крайней мере INT основной (аннулируются) {}
3) нет необходимости бросать таНос, его тип возвращаемого значения является недействительным *
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; 
} 

EDIT: как хама сказал в своем комментарии, есть важная вещь, которую вы должны знать, что если вы объявляете переменную внутри функции или использовать в качестве параметр не влияет на функцию 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

Смежные вопросы