Вызов strtok(tmp, " ")
приведет к неопределенному поведению, так как он попытается изменить строковый литерал, на который указывает tmp
, но так как операнд sizeof
не оценивается (с одним исключением, которое здесь не применяется), это не проблема.
Реальная проблема заключается в том, что вы пытаетесь напечатать size_t
значения в формате "%ld"
, для которого требуется аргумент unsigned long
.
Есливаша реализация поддерживает его, правильный формат для аргумента size_t
: "%zu"
(добавлен в C99):
printf("size of char * = %zu and size of strtok return val = %zu\n",
sizeof(char *), sizeof(strtok(tmp," ")));
В противном случае явно преобразуйте аргументы в соответствующий размер.Я бы использовал "%lu"
, поскольку size_t
- это тип без знака.
printf("size of char * = %lu and size of strtok return val = %lu\n",
(unsigned long)sizeof(char *), (unsigned long)sizeof(strtok(tmp," ")));
Вот полная автономная программа, которая должна давать ожидаемые результаты при любой реализации C89 или более поздней версии:
#include <stdio.h>
#include <string.h>
int main(void) {
char * tmp = "How are you?";
printf("size of char * = %lu and size of strtok return val = %lu\n",
(unsigned long)sizeof(char *),
(unsigned long)sizeof(strtok(tmp," ")));
return 0;
}
РЕДАКТИРОВАТЬ: Комментарий ОП к другому ответу указывает, что проблема была в заголовке string.h
;очевидно, у него было
#include "string.h"
, а не
#include <string.h>
Я собираюсь оставить этот ответ здесь, потому что он описывает другую проблему, которая должна быть исправлена в коде ОП, но нетот, который вызвал наблюдаемый симптом.и компилятор подобрал неправильный заголовочный файл string.h
.