- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道之前有人问过这个问题,但之前的回答说你不能修改字符串文字,除非我误解了,否则我不能。我可以成功地使用 strtok_r 直到输入的最后一行,然后出现段错误。为什么会这样?这是我的代码的简化版本。从打印中我知道它通过 get b 进行处理,但随后出现段错误?
#include <stdio.h>
#include <string.h> //strlen
#include <stdlib.h>
void handler(char * input){
char * end_str;
char * token =strtok_r(input, "\n", &end_str);
char * endd_str;
char * token2= strtok_r(token, " ", &endd_str);
while(token!=0){
printf("%s\n",token);
token=strtok_r(NULL,"\n",&end_str);
while(token2 !=0){
token2 =strtok_r(NULL," ",&endd_str);
printf("%s\n",token2);}
}
}
int main(int argc , char *argv[])
{
char test[100]="set a,10.5\nset b,11.5\nget b\nadd e,a,b\nsub g,a,b";
handler(test);
return 0;
}
最佳答案
您正在交错使用同一字符串的 strtok_r
调用。在内层while
循环的第二次迭代中,在调用token2 =strtok_r(NULL,"",&endd_str);
之前,endd_str
点为空字符串,因为它匹配的字符串已到达末尾,因此 strtok_r
返回 NULL
。将 NULL
传递给 printf
会导致段错误。
每次解析 "\n"
定界符后,重新开始循环遍历 ""
定界符。在你用尽内部的之前,不要再做外部的。此外,将您的 strtok_r
调用移动到循环的末尾,以便 while
条件正确检查它们。
您需要执行以下操作:
void handler(char * input){
char * end_str;
char * token =strtok_r(input, "\n", &end_str);
while(token!=0){
printf("%s\n",token);
char * endd_str;
char * token2= strtok_r(token, " ", &endd_str);
while(token2 !=0){
printf("%s\n",token2);
token2 =strtok_r(NULL," ",&endd_str); // call at end of loop
}
token=strtok_r(NULL,"\n",&end_str); // call at end of loop
}
}
输出:
set a,10.5
set
a,10.5
set b,11.5
set
b,11.5
get b
get
b
add e,a,b
add
e,a,b
sub g,a,b
sub
g,a,b
关于c - strtok_r 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34317739/
我正在尝试执行嵌套的strtok_r。我有一个 gzipped csv 文件,我正在尝试使用 zpipe.c 读取该文件。我注意到,当我尝试打印 out 变量时,如果我第二次使用 strtok_r,它
我的 strtok_r() 实现遇到问题。我正在解析一个文本文件,如果遇到 ";" ,它会将其视为注释并忽略它,解析文件中的标记(由空格分隔的任何内容)。 这是一个这样的文件: 1) ;; 2) ;;
char buffer[1000]; recv(sock, buffer, sizeof(buffer), 0); char *ptr; printf("\n%s\n", bu
我正在尝试为微型 cstrings“&&”和“||”标记一个字符串。我一直在使用 strtok_r() 取得一些成功,但由于对 strtok_r() 缺乏理解,或者可能是对指针的误解,我似乎无法让解析
correct strtok_r的使用方法如下: char* str = strdup(string); char* save; char* ptr = strtok_r(str, delim, &s
我的字符串是: He is a "funny" guy 如何使用 strtok_r 提取它? strtok_r(str, "\"", &last_pointer); 这是正确的做法吗?上面的语句会先跳
我像这样使用 strtok_r: char *the_sting = "a|b||e|f"; char *last; char *current; current = (char*)strtok_r(
这是我的程序片段 #include #include void something_wrong_really(char *str) { char *savedptr = NULL
我正在使用 Visual Studio 2015,并且正在尝试使用 strtok_r。由于某种原因,编译器无法识别它。 这是我的代码: #include #include #include ch
这段代码是解析一个csv文件,但是会导致segmentation fault。我可以在这里看到类似的代码:Nested strtok function problem in C 它们看起来一样,但我的
如何使用 strtok_r 而不是 strtok 来执行此操作? char *pchE = strtok(NULL, " "); 现在我正在尝试正确使用 strtok_r...但有时我会遇到 strt
我知道之前有人问过这个问题,但之前的回答说你不能修改字符串文字,除非我误解了,否则我不能。我可以成功地使用 strtok_r 直到输入的最后一行,然后出现段错误。为什么会这样?这是我的代码的简化版本。
1. strtok介绍 众所周知,strtok可以根据用户所提供的分割符(同时分隔符也可以为复数比如“,。”) 将一段字符串分割直到遇到"\0". 比如,分隔符=“,” 字符
我有一个字符串,其中包含一些逗号分隔的值。该值可能为 NULL,也可能不为 NULL。像: strcpy(result, "Hello,world,,,wow,"); 我也希望打印接受空值。使用 st
我想用以下代码在c中分割一个字符串: char *search = "+" ; char *temp1; char *temp2; char *saveptr1, *saveptr2 ; int op
我试图弄清楚如何提取需要解析的剩余字符串(strtok_r() 的第三个参数),但不知道如何执行此操作。初始输入来自于 malloc() 定义的 char 指针。 下面的代码是我想要实现的目标。 nu
所以我遇到了一些与我之前的 C 编程探索相关的问题。这次介绍如何使用 strtok_r 或 strtok 将名称与 /etc/passwd 文件分开。协议(protocol)是我想将用户名分成两部分,
我发现了类似的帖子,但对于我关于 strtok_r 的问题没有明确的答案。 我正在使用 strtok_r 解析命令行以获取我需要通过带有标志的 execv 执行的命令,但是,出于测试目的,我打印出来。
我正在写一个简单的shell。我需要在此 shell 上添加历史记录功能,这将允许我检查 shell 之前收到的命令。我已经尝试了这么久,我无法弄清楚为什么我的命令[]数组在这里为NULL for (
我在下面的代码段中的 strtok_r 中遇到了段错误,我花了几个小时试图找出原因。其他页面上的答案说您无法修改字符串文字,但(据我所知)我不是。 #include #include #inclu
我是一名优秀的程序员,十分优秀!