Tag: strtok

实现`strtok`,其分隔符有多个字符

代码段: char str[] = “String1::String2:String3:String4::String5”; char *deli = “::”; char *token = strtok(str,deli); while(token != NULL) { printf(“Token= \”%s\”\n”, token); token=strtok(NULL,deli); } 上面的代码片段产生输出: Token=”String1″ Token=”String2″ Token=”String3″ Token=”String4″ Token=”String5″ 但我希望输出为: Token=”String1″ Token=”String2:String3:String4″ Token=”String5″ 我知道我没有得到预期的输出,因为strtok的第二个参数中的每个字符都被视为分隔符。 为了获得预期的输出,我编写了一个程序,它使用strstr (以及其他东西)将给定的字符串拆分为标记,以便获得预期的输出。 这是程序: #include #include #include #include int myStrtok(char* str,char* deli) { if(str==NULL || deli==NULL) return -1; int tokens=0; char *token; char […]

strtok()问题:如果标记由分隔符分隔,为什么分隔符和空’\ 0’之间的最后一个标记?

在下面的程序中, strtok()在主要部分按预期工作,但我无法理解一个发现背后的原因。 我读过关于strtok() : 为了确定令牌的开始和结束,该函数首先从起始位置扫描未包含在分隔符中的第一个字符(它成为令牌的开头)。 然后从令牌的这个开头开始扫描包含在分隔符中的第一个字符,这将成为令牌的结尾。 资料来源: http : //www.cplusplus.com/reference/cstring/strtok/ 而且我们知道, strtok()在每个令牌的末尾放置一个\0 。 但是在下面的程序中,最后一个分隔符是一个点( . ),之后在该点和引号( ” )之间有Toad 。现在,dot是我程序中的分隔符,但在Toad之后没有分隔符,甚至不是白色空间(这是我程序中的分隔符)。请清除以下由此前提产生的混乱: 为什么strtok()将Toad视为令牌,即使它不在2个分隔符之间? 这是我在遇到NULL字符( \0 )时读到的关于strtok() )的内容: 一旦在strtok的调用中找到了str的终止空字符,所有后续调用此函数并使用空指针作为第一个参数返回空指针。 资料来源: http : //www.cplusplus.com/reference/cstring/strtok/ 没有任何地方说过一旦遇到一个空字符,就会返回一个指向令牌开头的指针(我们甚至没有令牌,因为我们没有得到令牌的结尾,因为没有找到分隔符字符在从令牌的开头开始扫描之后(即从Toad的’T’开始),我们只发现了一个空字符, 而不是一个分隔符 。 那么为什么参数字符串的最后一个分隔符和引号之间的部分被strtok()视为一个标记? 请解释一下。 码: #include #include int main () { char str[] =” Falcon,eagle-hawk..;buzzard,gull..pigeon sparrow,hen;owl.Toad”; char * pch=strtok(str,” ;,.-“); while (pch != NULL) { […]

使用fgets和strtok从文件中读取和解析行

我在使用相当基本的代码时遇到了麻烦。 我需要从下面显示的文件中读取每一行,用strtok将它分成3部分,并将每个部分存储到一个数组中。 “目标”和“助手”的数组工作正常,但由于某种原因,整个名称数组都填充了从文件中读取的姓氏。 输入文件: Redden 2 0 Berglund 5 2 Jackman 2 0 Stewart 4 0 Oshie 3 5 McDonald 2 4 Pietrangelo 2 7 Perron 2 6 Tarasenko 5 5 相关代码: int main(int argc, char* argv){ FILE* inFile = fopen(argv[1],”r”); char ** nameArray; int * goalArray; int * assistArray; int size = countLinesInFile(inFile); allocateMemory(&goalArray, […]

C – strtok上的意外分段错误(…)

我正在使用库的strtok(…),它似乎工作正常,直到结束条件,它导致分段错误和程序崩溃。 API声称strtok(…)将在没有更多令牌被找到时输出NULL,这意味着,我想,你必须捕获这个NULL才能终止你使用strtok运行的任何循环( …)。 我需要做什么才能捕获此NULL以防止程序崩溃? 我想象允许使用NULL作为终止条件。 我准备了一个SSCCE供你观察这种行为。 我需要strtok(…)来处理我正在编写的更大的软件,并且我得到完全相同的分段行为。 命令行的输出显示在此代码插图下方(是的,我知道您使用来封装库,但是我很难获得此post来显示代码库)。 我在Windows 8操作系统上使用gcc 4.5.3版本,下面显示了两种不同的方式,我想象一个人可以尝试在循环中捕获NULL。 #include #include #include #include #include #include #include main(){ char* from = “12.34.56.78”; char * ch = “.”; char * token = strtok(from, ch); printf(“%s\n”,token); while(token != NULL){ token = strtok(NULL, ch); printf(“%s\n”, token); } printf(“Broke out of loop!”); while(strcmp(token, 0) != 0){ printf(“%s\n”,token); token […]

为什么我们在strtok()中使用NULL?

为什么我们在strok()函数中使用null? while(h!=NULL) { h=strtok(NULL,delim); if(hold!=NULL) printf(“%s”,hold); } 当* h指向字符串时,该程序会执行什么操作?

解析$ PATH变量并将目录名保存到字符串数组中

我想解析Linux的$ PATH变量,然后将用’:’分隔的目录名保存到字符串数组中。 我知道这是一个简单的任务,但我被困住了,任何帮助都会很好。 到目前为止我的代码是这样的,但有些东西是不对的。 char **array; char *path_string; char *path_var = getenv(“PATH”); int size_of_path_var = strlen(path_var); path_string = strtok(path_var, “:”); while (path_string != NULL) { ss = strlen(path_string) array[i] = (char *)malloc(ss + 1); array[i] = path_string; //this is actually all i want to do for every path i++; path_string = strtok(NULL, “:”); }

strtok程序崩溃

http://www.opengroup.org/onlinepubs/000095399/functions/strtok.html上的strtok程序每次都会崩溃.. #include … char *token; char *line = “LINE TO BE SEPARATED”; char *search = ” “; /* Token will point to “LINE”. */ token = strtok(line, search); /* Token will point to “TO”. */ token = strtok(NULL, search); 如果我使用char数组作为变量’line’,它可以工作。 即char line [] =“LINE TO BE SEPARATED”有效。 请解释一下。

strtok和分段错误的问题

我有两个辅助函数来分解十进制价格格式的字符串,即。 “23.00”,“2.30” 考虑一下: char price[4] = “2.20”; unsigned getDollars(char *price) { return atoi(strtok(price, “.”)); } unsigned getCents(char *price) { strtok(price, “.”); return atoi(strtok(NULL, “.”)); } 现在,当我运行以下时,我得到一个分段错误: printf(“%u\n”, getDollars(string)); printf(“%u\n”, getCents(string)); 然而,当我单独运行它们而没有一个跟随另一个时,它们工作正常。 我在这里想念的是什么? 我是否必须进行某种重置strtok? 我的解决方案 根据我在下面选择的答案获得的关于strtok的知识,我更改了辅助函数的实现,以便它们首先复制传入的字符串,从而屏蔽原始字符串并防止出现此问题: #define MAX_PRICE_LEN 5 /* Assumes no prices goes over 99.99 */ unsigned getDollars(char *price) { /* Copy the string to […]

使用fgets()和strtok()在C中逐行读取文件?

我正在尝试使用fgets和strtok()逐行读取文件,并创建每个不同信息行的链接列表。 现在,我只是将信息放入一个数组,只是为了试图弄清楚如何正确读取信息,但它不能正常工作。 在while(fgets)部分,它似乎正确地将所有内容加载到数组中,并将其打印出来。 然而,在循环执行之后我尝试打印整个数组,我得到了非常奇怪的结果..这主要是最后一行的部分,而不是大部分的完整单词或任何东西。 例如,如果我正在读书: Simpson, Homer, Male, 1976 Simpson, Marge, Female, 1978 Simpson, Bart, Male, 2002 Simpson, Lisa, Female, 2004 Simpson, Maggie, Female, 2011 我最后得到的打印输出是这样的: le Simpson Maggie Simpson Maggie e ale Simpson Maggie e e Simpson Maggie Female 2011 请让我知道我哪里出错了,谢谢! #include #include #include #define MAXSTRINGSIZE 10 #define LINESIZE 128 struct person{ char firstName[MAXSTRINGSIZE]; […]

使用strtok_r时出现分段错误

任何人都可以解释为什么我在下面的例子中得到分段错误? #include #include int main(void) { char *hello = “Hello World, Let me live.”; char *tokens[50]; strtok_r(hello, ” ,”, tokens); int i = 0; while(i < 5) { printf("%s\n", tokens[i++]); } }