Основная ваша ошибка в том, что вы выбрали неправильную функцию для выполнения задачи. 1018 * хотя они не имеют постоянных типов массивов символов, они неизменны. Любая попытка изменить строковый литерал приводит к неопределенному поведению. И функция strtok
изменяет переданную ей строку, вставляя завершающий ноль между подстроками.
Вместо функции strtok
следует использовать строковые функции strspn
и strcspn
. Они не меняют переданный аргумент. Таким образом, используя эти функции, вы можете обрабатывать и строковые литералы.
Вот демонстрационная программа.
#include <stdio.h>
#include <string.h>
size_t find_short( const char *s )
{
const char *delim= " \t";
size_t shortest = 0;
while ( *s )
{
s += strspn( s, delim );
const char *p = s;
s += strcspn( s, delim );
size_t n = s - p;
if ( shortest == 0 || ( n && n < shortest ) ) shortest = n;
}
return shortest;
}
int main(void)
{
const char *s = "lel qwew dasdqew";
printf( "%zu", find_short( s ) );
return 0;
}
Ее вывод
3