srtok 在 c 中不工作
srtok is not working in c
这是我的代码,
#include <string.h>
#include <stdio.h>
main ()
{
explode (" ", "this is a text");
}
explode (char *delimiter, char string[])
{
char *pch;
printf ("Splitting string \"%s\" into tokens:\n",string);
pch = strtok (string,delimiter);
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, delimiter);
}
return 0;
}
我使用 gcc -o 1.exe 1.c
编译此代码并且没有显示错误。但是当我执行 1.exe
它显示 Splitting string "this is a text" into tokens:
并且在那一刻 1.exe
停止工作(显示 windows 的对话框)。任何人都可以告诉问题并解决问题吗?我正在使用 windows 10.
在您的 explode()
函数中,您正在传递 字符串 liteal ("this is a text"
) 并使用与 [=12= 的输入相同的字符串].
由于strtok()
修改了输入字符串,在这里,它会调用调用undefined behavior。如第 C11
标准第 §6.4.5 章所述,字符串文字
[...] If the program attempts to modify such an array, the behavior is
undefined.
你可以
- 定义一个数组并使用 字符串文字 对其进行初始化,并将该数组用作
strtok()
. 的输入
- 获取一个指针,使用
strdup()
复制初始值设定项,然后将该指针提供给 strtok()
。
最重要的是,strtok()
的输入字符串应该是可修改的。
虽然不能使用 strtok 执行此操作,因为无法修改文字,但可以使用 strcspn 执行此操作。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void explode (char *delimiter, char *string);
int main()
{
explode (" ", "this is a text");
return 0;
}
void explode (char *delimiter, char *string)
{
int span = 0;
int offset = 0;
int length = 0;
if ( delimiter && string) {
length = strlen ( string);
printf ("Splitting string \"%s\" into tokens:\n",string);
while (offset < length) {
span = strcspn ( &string[offset],delimiter);//work from offset to find next delimiter
printf ("%.*s\n",span, &string[offset]);//print span number of characters
offset += span + 1;// increment offset by span and one characters
}
}
}
这是我的代码,
#include <string.h>
#include <stdio.h>
main ()
{
explode (" ", "this is a text");
}
explode (char *delimiter, char string[])
{
char *pch;
printf ("Splitting string \"%s\" into tokens:\n",string);
pch = strtok (string,delimiter);
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, delimiter);
}
return 0;
}
我使用 gcc -o 1.exe 1.c
编译此代码并且没有显示错误。但是当我执行 1.exe
它显示 Splitting string "this is a text" into tokens:
并且在那一刻 1.exe
停止工作(显示 windows 的对话框)。任何人都可以告诉问题并解决问题吗?我正在使用 windows 10.
在您的 explode()
函数中,您正在传递 字符串 liteal ("this is a text"
) 并使用与 [=12= 的输入相同的字符串].
由于strtok()
修改了输入字符串,在这里,它会调用调用undefined behavior。如第 C11
标准第 §6.4.5 章所述,字符串文字
[...] If the program attempts to modify such an array, the behavior is undefined.
你可以
- 定义一个数组并使用 字符串文字 对其进行初始化,并将该数组用作
strtok()
. 的输入
- 获取一个指针,使用
strdup()
复制初始值设定项,然后将该指针提供给strtok()
。
最重要的是,strtok()
的输入字符串应该是可修改的。
虽然不能使用 strtok 执行此操作,因为无法修改文字,但可以使用 strcspn 执行此操作。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void explode (char *delimiter, char *string);
int main()
{
explode (" ", "this is a text");
return 0;
}
void explode (char *delimiter, char *string)
{
int span = 0;
int offset = 0;
int length = 0;
if ( delimiter && string) {
length = strlen ( string);
printf ("Splitting string \"%s\" into tokens:\n",string);
while (offset < length) {
span = strcspn ( &string[offset],delimiter);//work from offset to find next delimiter
printf ("%.*s\n",span, &string[offset]);//print span number of characters
offset += span + 1;// increment offset by span and one characters
}
}
}