1

我正在学习 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)
4

2 回答 2

3

的语法strtok()是:

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

请注意,第二个参数是 char 指针,而不是 char,因此每个调用中的第二个参数都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

于 2019-05-11T06:37:52.197 回答
3

这是一个错误,只需更换

strtok(str,'.');

strtok(str,".");

strtok() 的第二个参数表示分隔符并期望类型

常量字符 *

所以必须用“”括起来。

strtok() 的语法

char *strtok(c​​har *str, const char *delim);

于 2019-05-11T05:53:37.687 回答