C : предупреждение: присваивание делает указатель целым без приведения [включено по умолчанию]

это мой код

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

void main() {
    FILE *fp;
    char * word;
    char line[255];
    fp=fopen("input.txt","r");
    while(fgets(line,255,fp)){
        word=strtok(line," ");
        while(word){
            printf("%s",word);
            word=strtok(NULL," ");
        }
    }
}

Это предупреждение, которое я получаю.

token.c:10:7: warning: assignment makes pointer from integer without a cast [enabled by default]
   word=strtok(line," ");
       ^

token.c:13:8: warning: assignment makes pointer from integer without a cast [enabled by default]
    word=strtok(NULL," ");
        ^

word объявляется как char*. Тогда почему возникает это предупреждение?


person jophab    schedule 07.01.2017    source источник
comment
Вы забыли #include <string.h>   -  person EOF    schedule 07.01.2017
comment
О.. Вот так :+1   -  person jophab    schedule 07.01.2017
comment
Отнеситесь серьезно к предупреждению вашего компилятора.   -  person alk    schedule 07.01.2017


Ответы (3)


Включите #include <string.h>, чтобы получить прототип для strtok().

Ваш компилятор (как и в C до C99) предположил, что strtok() возвращает int из-за этого. Но отсутствие объявления/прототипа функции недействительно в современном C (начиная с C99).

Там использовалось старое правило в C, которое разрешало неявные объявления функций. Но неявное правило int было удалено из языка C начиная с C99.

См.: Вызовы функций C: понимание неявного правила int

person P.P    schedule 07.01.2017
comment
Спасибо @P.P. Решено. - person jophab; 07.01.2017
comment
Просто пытаясь получить некоторые разъяснения, стандарт также явно упоминает слова неявного объявления функции, не так ли? - person Sourav Ghosh; 07.01.2017
comment
Но я не претендовал на то, чтобы цитировать стандарт. Правило, которое включает в себя как неявную функцию dec, так и неявный тип для params — оба предполагаются как int, обычно называется неявным правилом int. Оба они были упомянуты и удалены в C99. - person P.P; 07.01.2017
comment
Хорошо, сэр, тогда просто для того, чтобы мои факты были правильными, неявное правило int предназначено не только для опущенного типа, оно также включает объявление неявной функции, верно? - person Sourav Ghosh; 07.01.2017
comment
Кроме того, вы упомянули я сказал неявное правило int (используемое в стандартах C), но я не могу найти его использование, не могли бы вы сослаться на использование, пожалуйста? Большое спасибо. :) - person Sourav Ghosh; 07.01.2017

strtok() прототипируется в <string.h>, вам нужно включить его.

В противном случае из-за отсутствия предварительного объявления ваш компилятор предполагает, что любая используемая функция, сигнатура которой ему не известна, возвращает int и принимает любое количество параметров. Это было названо неявным объявлением .

FWIW, объявление неявной функции теперь недействительно в соответствии с последним стандартом. Цитируя C11, Предисловие, «Основные изменения во втором издании включали:»

  • удалить неявное объявление функции
person Sourav Ghosh    schedule 07.01.2017

Вам нужно включить string.h

#include <string.h>
person Zbynek Vyskovsky - kvr000    schedule 07.01.2017
comment
Да. Спасибо, я понял - person jophab; 07.01.2017