Strtok_r 返回 NULL

     2023-02-16     30

关键词:

【中文标题】Strtok_r 返回 NULL【英文标题】:Strtok_r returning NULL 【发布时间】:2019-06-19 14:47:47 【问题描述】:

我正在尝试对从文件中提取的字符串进行标记。 strtok_r 在第一个子字符串上正常工作,然后返回 null(以及分段错误,因为我尝试将 strndup 转换为另一个 var)

char buffer[500];
char * c;
char * c1;
char * c2;
//....
while(fgets(buffer, sizeof(buffer), f) != NULL)
    c2 = buffer;
    printf("%s\n", buffer);
    c = strtok(c2, ":");
    for(int i = 0; i < 4; i++)
        c = strtok(NULL, ":");
        printf("%s\n", c);
    
    if(strcmp(c, argp->origen) == 0)
        c = strtok(NULL, ":");
        printf("%s\n", c);
        if(strcmp(c, argp->destino) == 0)
            nodo = malloc(sizeof(lista_vuelo));
            c2 = buffer;

            c = strtok_r(c2, ":", &c1); 
            nodo->IdReg = atoi(c);
            printf("\n%d test\n", nodo->IdReg); //Works until here

            c = strtok_r(NULL, ":", &c1);
            printf("\n%s\n", c); //Prints null and then segmentation fault

            nodo->Idvuelo = strndup(c, strlen(c));
            printf("\n%s\n", nodo->Idvuelo);
//....

文件输入:

3:IBE3674:02-04-2019:19-45:马德里:柏林:巴拉哈斯:泰格尔:伊比利亚:210:35:6:T4:60:N

输出:

3 次测试 -> 预期输出

(null)
Violación de segmento (`core' generado) -> Segmentation fault, (null) should be IBE3674

【问题讨论】:

你的意见是什么? @Yastanub 从文件中读取,输入为 3:IBE3674:02-04-2019:19-45:Madrid:Berlin:Barajas:Tegel:IBERIA:210:35:6:T4 :60:N // 将其添加到主帖 你期望 strtok 返回什么?为什么? 指向下一个标记的指针,以便我可以将其添加到结构中包含的字符指针中 好吧,如果strtok 返回NULL 之后你的程序崩溃了,你应该考虑在使用NULL 指针之前检查返回值。如果您已经将NULL 传递给printf,则会调用未定义的行为。之后您仍然忽略NULL 并将指针输入strlenstrndup。如果您将 NULL 输入到大量意想不到的函数中,那么崩溃也就不足为奇了 【参考方案1】:

strtok 不只是修改它传递的指针,而是实际修改字符串本身。它用null 字符替换每个找到的分隔符。

如果你有字符串test:strtok:for:me,然后在你有test\0strtok:for:me之后调用strtok

因此,当您迭代提供前几个令牌时,每个 : 都将替换为 \0。如果您现在将指针 c2 重置为字符串的开头并再次调用 strtok,strtok 会在找到分隔符之前找到 null 字符,并假定字符串在找到分隔符之前结束并返回 NULL

【讨论】:

所以,我应该将缓冲区的副本复制到 c2 中,而不仅仅是分配指针,对吗?是的,它成功了,非常感谢你 @Opresor 这将是一种可能性,但随后您在内存中有 2 次相同的字符串(几乎至少)。您还可以将第一个标记保存到一个数组中,然后再使用它们。另请注意,strtok 不会创建新字符串,而只会将分隔符替换为 0,然后返回指向标记开头的指针。因此,您的实际字符串并没有真正拆分,而只是分段。如果删除初始字符串,所有标记都将失效。

strtok_r 导致“赋值使指针从整数不进行强制转换”

】strtok_r导致“赋值使指针从整数不进行强制转换”【英文标题】:strtok_rcausing"assignmentmakespointerfromintegerwithoutacast"【发布时间】:2013-06-0514:41:24【问题描述】:我正在尝试在C中标记字符串并使用strtok_r将标记保存到多个... 查看详情

关于函数strtok和strtok_r的使用要点和实现原理

...函数的一些注意事项,本篇将介绍strtok的一个应用并引出strtok_r函数。 1.一个应用实例网络上一个比较经典的例子是将字符串切分,存入结构体中。如,现有结构体12345typedefstructperson{    查看详情

关于函数strtok和strtok_r的使用要点和实现原理

本文转载自:http://astute11.blog.51cto.com/4404646/1334198strtok函数的使用是一个老生常谈的问题了。该函数的作用很大,争议也很大。以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证。交代一... 查看详情

为啥 WCF/JSON 不为 null 返回值返回“null”?

】为啥WCF/JSON不为null返回值返回“null”?【英文标题】:Whydoesn\'tWCF/JSONreturn`null`foranullreturnvalue?为什么WCF/JSON不为null返回值返回“null”?【发布时间】:2016-12-2804:29:15【问题描述】:根据JSONspec,表示空值的正确方法是文字null... 查看详情

monitor.getDropResult() 返回 null

】monitor.getDropResult()返回null【英文标题】:monitor.getDropResult()returnnull【发布时间】:2017-01-0723:38:24【问题描述】:monitor.getDropResult()返回null(我看它是console.log)。它应该返回对象(拖动的项目)及其位置。为什么返回null?我用... 查看详情

标量值函数不返回 NULL,而是返回“NULL”字符串

】标量值函数不返回NULL,而是返回“NULL”字符串【英文标题】:Scalar-valuedfunctiondoesnotreturnNULLbuta\'NULL\'string【发布时间】:2018-11-0509:25:27【问题描述】:我需要将数据从Excel导入到mssql数据库中,我认为使用OPENROWSET会是个好主意... 查看详情

返回一个空任务还是返回null更好? C#

】返回一个空任务还是返回null更好?C#【英文标题】:Isitbettertoreturnanemptytaskornull?c#【发布时间】:2018-01-0223:15:24【问题描述】:我有一个异步方法,它将通过Api为作业调度服务查找jobId。如果没有找到结果是返回一个空任务还... 查看详情

places.getLatLng() 返回 null 虽然 places.getName() 没有返回 null

】places.getLatLng()返回null虽然places.getName()没有返回null【英文标题】:places.getLatLng()returningnullthoughplaces.getName()isnotreturningnull【发布时间】:2019-08-2100:36:14【问题描述】:我一直在尝试从自动完成中单击一个位置后获取latlng,但奇... 查看详情

为啥 returnValueMap() 返回 NULL

】为啥returnValueMap()返回NULL【英文标题】:WhyreturnValueMap()isreturningNULL为什么returnValueMap()返回NULL【发布时间】:2019-09-2913:05:51【问题描述】:试图在测试中模拟一个学说存储库,当与findOneBy方法一起使用时,returnValueMap()总是返回... 查看详情

为啥getResource返回null

】为啥getResource返回null【英文标题】:WhydoesgetResourcereturnnull为什么getResource返回null【发布时间】:2015-07-0420:20:29【问题描述】:我正在尝试访问我的项目中的文件。但是getResource方法返回null。这是我的项目的样子:Thread.currentThr... 查看详情

Redis hasKey 方法返回 NULL

】RedishasKey方法返回NULL【英文标题】:RedishasKeymethodreturnNULL【发布时间】:2021-12-3002:18:18【问题描述】:redishasKey方法什么时候可以返回null?我已经看到,如果我们在方法参数中也传递null,它会返回false。那么是否有任何情况下... 查看详情

Oracle 函数调用的返回值返回 null

】Oracle函数调用的返回值返回null【英文标题】:ReturnvaluefromOraclefunctioncallreturnsnull【发布时间】:2018-07-1820:25:56【问题描述】:我正在尝试从我们的C#应用程序调用Oracle函数,但它返回null而不是数字。该函数只执行COUNT(*)和RETURNS... 查看详情

返回新的 EmptyResult() VS 返回 NULL

】返回新的EmptyResult()VS返回NULL【英文标题】:returnnewEmptyResult()VSreturnNULL【发布时间】:2012-01-2313:35:02【问题描述】:在ASP.NETMVC中,当我的操作不会返回任何我使用的东西时returnnewEmptyResult()或returnnull有什么不同吗?【问题讨论... 查看详情

android片段getArguments()返回null

】android片段getArguments()返回null【英文标题】:androidfragmentsgetArguments()returnnull【发布时间】:2012-09-1308:05:27【问题描述】:getArguments()返回null!活动中的代码:if(savedInstanceState==null)//Duringinitialsetup,pluginthedetailsfragment.FlightLis 查看详情

ServletContext.getResourceAsStream 返回 null

】ServletContext.getResourceAsStream返回null【英文标题】:ServletContext.getResourceAsStreamreturningnull【发布时间】:2015-12-1618:06:53【问题描述】:我没有很幸运地发现为​​什么这会为ServletContext对象返回null。我尝试过使用相对和绝对文件... 查看详情

Android Room 将 Null 作为非 Null 类型返回

】AndroidRoom将Null作为非Null类型返回【英文标题】:AndroidRoomreturnsNullasNon-Nulltype【发布时间】:2019-04-1017:36:27【问题描述】:我有Dao返回简单对象。如果对象不存在,Room返回null,但Android应用没有崩溃。此外,如果我将该值分配... 查看详情

GoogleSignInAccount getPhotoUrl() 返回 null

】GoogleSignInAccountgetPhotoUrl()返回null【英文标题】:GoogleSignInAccountgetPhotoUrl()returnnull【发布时间】:2016-02-2903:10:56【问题描述】:尝试从已登录的个人资料中获取照片。但总是返回null。姓名和电子邮件返回值,只有照片有问题。Go... 查看详情

findFragmentById 返回 null

】findFragmentById返回null【英文标题】:findFragmentByIdreturnnull【发布时间】:2014-06-1417:21:02【问题描述】:当我使用片段的id调用findFragmentById()时,它会返回null。activity_main.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="ht 查看详情