использование strtok () в c показывает предупреждения и возвращает ошибку сегментации (дамп памяти) - PullRequest
1 голос
/ 11 мая 2019

Я изучаю строковые операции C и использую функцию strtok(). Мой код заканчивался предупреждением, а затем вывод был ошибкой сегментации.

Вот исходный код (в файле token3.c ):

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "aa.bb.cc.dd.ee.ff";
    char *p;
    p = strtok(str, '.');
    while (p != NULL) {
        printf("%s\n", p);
        p = strtok(NULL, '.');
    }
    return 0;
}

Предупреждения при компиляции:

token3.c: In function ‘main’:
token3.c:6:15: warning: passing argument 2 of ‘strtok’ makes pointer from integer without a cast [-Wint-conversion]
      p=strtok(str,'.');
                   ^~~
In file included from token3.c:2:0:
/usr/include/string.h:335:14: note: expected ‘const char * restrict’ but argument is of type ‘int’
extern char *strtok (char *__restrict __s, const char *__restrict __delim)
               ^~~~~~
token3.c:9:17: warning: passing argument 2 of ‘strtok’ makes pointer from integer without a cast [-Wint-conversion]
    p=strtok(NULL,'.');<br>
                  ^~~
In file included from token3.c:2:0:
/usr/include/string.h:335:14: note: expected ‘const char * restrict’
but argument is of type ‘int’
    extern char *strtok (char *__restrict __s, const char *__restrict __delim)
                                               ^~~~~~<

ожидаемый результат:

aa
bb
cc
dd
ee
ff

фактическая выработка:

Segmentation fault(core dumped)

Ответы [ 2 ]

3 голосов
/ 11 мая 2019

синтаксис для strtok():

char *strtok( char *str, const char *delim );

Обратите внимание, что вторым параметром является указатель на символ, а не символ, поэтому второй параметр в каждом из вызовов strtok() должен быть заключен в двойные кавычки, а не в одинарные кавычки

После исправления синтаксиса и добавления некоторого интервала для удобочитаемости, результирующий код будет:

#include <stdio.h>
#include <string.h>


int main( void ) 
{
    char str[] = "aa.bb.cc.dd.ee.ff";
    char *p;
    p = strtok( str, "." );

    while( p ) 
    {
        printf( "%s\n", p );
        p = strtok( NULL, "." );
    }
    return 0;
}

и при запуске исправленного исходного кода вывод:

aa
bb
cc
dd
ee
ff

Примечание: с современными компиляторами C утверждение:

return 0;

может быть исключено, поскольку возвращение из main() (если не указано иное) равно 0

3 голосов
/ 11 мая 2019

Это была ошибка, просто замените

strtok(str,'.');

на

strtok(str,".");

2-й аргумент strtok () это разделители и ожидает тип

const char *

и поэтому должны быть заключены в "".

Синтаксис strtok ()

char * strtok (char * str, const char * delim);

...