我strtok()在c中使用来解析csv字符串.首先我将它标记为只是找出有多少令牌,这样我就可以分配一个正确大小的字符串.然后我使用上次用于标记化的相同变量.每次我第二次这样做虽然它strtok(NULL, ",")返回,NULL即使还有更多的令牌需要解析.谁能告诉我我做错了什么?
char* tok;
int count = 0;
tok = strtok(buffer, ",");
while(tok != NULL) {
count++;
tok = strtok(NULL, ",");
}
//allocate array
tok = strtok(buffer, ",");
while(tok != NULL) {
//do other stuff
tok = strtok(NULL, ",");
}
Run Code Online (Sandbox Code Playgroud)
所以在第二个while循环中它总是在找到第一个标记后结束,即使有更多的标记.有人知道我做错了什么吗?
我想分解一个句子并将每个字符串存储在一个数组中.这是我的代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
int i = 0;
char* strArray[40];
char* writablestring= "The C Programming Language";
char *token = strtok(writablestring, " ");
while(token != NULL)
{
strcpy(strArray[i], token);
printf("[%s]\n", token);
token = strtok(NULL, " ");
i++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它一直给我分段错误,我无法弄明白.我相信当我将令牌复制到我的阵列时,它有一些事情要做.
好.例如,我在我的txt文件中有这一行:
1|1,12;7,19;6,4;8,19;2,2
如你所见,它有2个部分,由...分隔|.我没有问题获得两个部分,并1,12;7,19;6,4;8,19;2,2使用;分离器分离第二部分.但我确实有进一步分离的问题,,以获得每组的第一和第二个数字.
这是我目前的代码:
result = strtok(result, ";");
while(result != NULL ) {
printf("%s\n", result);
result = strtok(NULL, ";");
}
Run Code Online (Sandbox Code Playgroud)
它输出我:
1,12
7,19
6,4
8,19
2,2
太好了.但是,当我尝试"strtok"(我正在使用此方法进行拆分)时,如下所示:
result = strtok(result, ";");
while(result != NULL ) {
//printf("%s\n", result);
help = strtok(result, ",");
while(help != NULL) {
printf("<%s>", help);
help = strtok(NULL, ",");
}
result = strtok(NULL, ";");
}
Run Code Online (Sandbox Code Playgroud)
我只得到"<1>,<12>",就像这组数字中只有一组一样.我不明白其他数字在哪里.相反,输出应该是:<1>,<12>,<7>,<19>,<6>,<4>,<8>,<19>,<2>,<2>.有人可以给出一个解决方案,如何获得每组的EACH号码这组数字.也许有其他方法或我做错了:)
谢谢!
我正在尝试对字符串进行标记,但我需要确切知道两个令牌之间何时没有数据.例如,当标记以下字符串" a,b,c,,,d,e"时,我需要知道' d'和' e' 之间的两个空槽...我无法简单地找到它strtok().我的尝试如下所示:
char arr_fields[num_of_fields];
char delim[]=",\n";
char *tok;
tok=strtok(line,delim);//line contains the data
for(i=0;i<num_of_fields;i++,tok=strtok(NULL,delim))
{
if(tok)
sprintf(arr_fields[i], "%s", tok);
else
sprintf(arr_fields[i], "%s", "-");
}
Run Code Online (Sandbox Code Playgroud)
用上述例子执行上述代码将字符a,b,c,d,e放入前五个元素中arr_fields是不可取的.我需要每个字符的位置进入数组的特定索引:即如果两个字符之间缺少一个字符,则应该按原样记录.
在下面的程序中,strtok()主要部分按预期工作,但我无法理解一个发现背后的原因.我读过strtok()这个:
为了确定令牌的开始和结束,该函数首先从起始位置扫描未包含在分隔符中的第一个字符(它成为令牌的开头).然后从令牌的开头开始扫描包含在分隔符中的第一个字符,这将成为令牌的结尾.
而且正如我们所知,在每个令牌的末尾strtok()放置一个\0.但是在下面的程序中,最后一个分隔符是一个点(.),之后在该点和引号()之间有Toad".现在点是我程序中的分隔符,但是在Toad之后没有分隔符,甚至没有空格(在我的程序中是分隔符).请清除以下因此产生的混淆:
为什么strtok()将Toad视为令牌,即使它不在2个分隔符之间?这是我strtok()遇到NULL字符(\0)时读到的内容:
一旦在strtok的调用中找到了str的终止空字符,所有后续调用此函数并使用空指针作为第一个参数返回空指针.
没有任何地方说过,一旦遇到空字符,就会返回一个指向令牌开头的指针(我们甚至没有令牌,因为我们没有得到令牌的结尾,因为没有找到分隔符字符在从令牌的开头开始扫描之后(即从Toad的'T'开始),我们只发现了一个空字符,而不是一个分隔符.那么为什么参数字符串的最后一个分隔符和引号之间的部分被认为是一个标记strtok()?请解释一下.
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] =" Falcon,eagle-hawk..;buzzard,gull..pigeon sparrow,hen;owl.Toad";
char * pch=strtok(str," ;,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ;,.-");
}
return 0; …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何在C++中对字符串进行标记?
您好我想知道如何用strtok标记std字符串
string line = "hello, world, bye";
char * pch = strtok(line.c_str(),",");
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
error: invalid conversion from ‘const char*’ to ‘char*’
error: initializing argument 1 of ‘char* strtok(char*, const char*)’
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种快速简便的方法,因为我认为它不需要太多时间
当我没有在我的代码中调用相同的函数时,一切都运行良好,但是当函数突然从递归返回时,变量pch为NULL:
void someFunction()
{
char * pch;
char tempDependencies[100*64+100];
strcpy(tempDependencies,map[j].filesNeeded);
pch = strtok(tempDependencies,",");
while (pch != NULL)
{
someFunction(); <- if i comment this out it works fine
pch = strtok (NULL, ",");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,例如当循环作用于字符串时,file2,file3,file4它正确地拆分file2并修改字符串,file2\\000file3,file4但下一次调用pch = strtok (NULL, ",");渲染pch为0x0.在调用递归时是否有我不知道的事情?
出于某种原因,我在第一次使用strtok()时得到一个异常我想要完成的是一个函数,它只是检查子串在字符串中是否重复.但到目前为止我还没有开始工作
int CheckDoubleInput(char* input){
char* word = NULL;
char cutBy[] = ",_";
word = strtok(input, cutBy); <--- **error line**
/* walk through other tokens */
while (word != NULL)
{
printf(" %s\n", word);
word = strtok(NULL, cutBy);
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
和主要调用功能:
CheckDoubleInput("asdlakm,_asdasd,_sdasd,asdas_sas");
Run Code Online (Sandbox Code Playgroud)

我有以下代码来标记包含由行分隔的行的字符串,\n并且每行具有由以下内容分隔的整数\t:
void string_to_int_array(char file_contents[BUFFER_SIZE << 5], int array[200][51]) {
char *saveptr1, *saveptr2;
char *str1, *str2;
char delimiter1[2] = "\n";
char delimiter2[2] = " ";
char line[200];
char integer[200];
int j;
for(j = 1, str1 = file_contents; ; j++, str1 = NULL) {
line = strtok_r(str1, delimiter1, &saveptr1);
if (line == NULL) {
break;
}
for (str2 = line; ; str2 = NULL) {
integer = strtok_r(str2, delimiter2, &saveptr2);
if (integer == NULL) {
break;
}
} …Run Code Online (Sandbox Code Playgroud) 我在弄清楚我收到分段错误的位置和原因时遇到了问题.
我正在编写一个C代码,提示用户输入正则表达式并编译它,然后输入一个包含多个句子的字符串:
int main(void){
char RegExp[50];
regex_t CompiledRegExp;
char *para;
char delim[] = ".!?,";
char *sentence;
char *ptr1;
printf("Enter regular expression: ");
fgets(RegExp, 50, stdin);
if (regcomp(&CompiledRegExp,RegExp,REG_EXTENDED|REG_NOSUB) != 0) {
printf("ERROR: Something wrong in the regular expression\n");
exit(EXIT_FAILURE);
}
printf("\nEnter string: ");
Run Code Online (Sandbox Code Playgroud)
strtok_r用于将字符串拆分为以下任一分隔符.,?!然后生成的标记(句子)用作regexec函数中的字符串参数,该函数搜索它以查看先前编译的正则表达式是否包含在标记中:
if( fgets(para, 1000, stdin)){
char *ptr = para;
sentence = strtok_r(ptr, delim, &ptr1);
while(sentence != NULL){
printf("\n%s", sentence);
if (regexec(&CompiledRegExp,sentence,(size_t)0,NULL,0) == 0) {
printf("\nYes");
} else {
printf("\nNo");
}
ptr = ptr1;
sentence = strtok_r(ptr, delim, &ptr1); …Run Code Online (Sandbox Code Playgroud)