问题标签 [strsep]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1266 浏览

c - 使用 fscanf 读取可变数量的整数

我有超过 100,000 个以下格式的 csv 文件:

我需要的只是字段 10 和字段 17,字段 10 是计数器,表示从字段 17 开始存储了多少整数,即我需要的是:

需要读取的最大整数数是 28。我可以通过 C++ 中的 Getline 轻松实现这一点,但是,根据我以前的经验,因为我需要处理超过 100,000 个这样的文件,每个文件可能有 300,000~400,000 行这样的行。因此,使用 Getline 读取数据并构建向量> 对我来说可能存在严重的性能问题。我尝试使用 fscanf 来实现这一点:

但是,这将多次调用 fscanf 并且还可能产生性能问题。有没有办法在 fscanf 的 1 次调用中读取可变数量的整数?或者我需要读入一个字符串然后 strsep/stoi 它?与 fscanf 相比,从性能角度来看,哪个更好?

0 投票
0 回答
519 浏览

c - 使用 strsep() 读取文本文件时出现空行/字符

我正在学习 C 并且作为一种练习,我正在尝试读取每行中具有不同数字集的文件,并打印(或保存到不同的文件)每行的每个数字(也作为字符串)。

你可以在这里看到代码:

当我在打印/写入时删除 '\n' 字符时,所有数字都会一个接一个地打印出来。我期望。问题是当我包含 \n 字符时,输出包含一些空行。我包括一个输入和输出文件的例子:

输入:

输出:

如您所见,当原始文件有换行符时,输出包含一个空行,但如果我删除 \n,它会打印/写入一个接一个的数字而没有空格:

如果 \n 是显式分隔符,则插入什么字符?

0 投票
1 回答
3278 浏览

c - strsep 如何在 C 中工作?

我正在创建一个程序,该程序在启动时接受输入命令和scanf的一些参数,并使用这些参数调用execvp 。我正在用strsep做这个。我将字符串存储在一个数组(char *)中,然后我想将它拆分并将令牌存储在一个新数组中(这次它是一个数组 [],所以我可以将它与 execvp 一起使用)。用scanf保存的参数应该是终端的命令(如“ls ”和“-l” ecc,“pwd” ......但是变量保存在PATH中),因此它们用“”分隔。

这是一个示例,仅用于指定将是哪种输入。我将单独执行 execvp,我需要帮助将字符串拆分为标记。这是代码:

调用strsep需要第 5 行和第 6 行,dest[10]中的 10是符号。

第 7 行将输入存储在 st。

第 9 行应该拆分为 " " 并将命令和参数存储在dest[I]中(我将传递给 execvp)。

第 11 行打印 dest 存储的内容。

这是可悲的输出:

我不明白 strsep 是如何工作的,有人可以帮助我吗?

0 投票
1 回答
187 浏览

c - strtok_r 保存状态行为

正确的使用strtok_r方法如下:

当试图检查实际存储的内容时save,我发现它只是未解析字符串的其余部分。所以我试图让第二个调用看起来像第一个,并编写了一个包装器,如下所示。

这可以像下面这样使用,它不那么冗长。我们不必区分第一次呼叫和休息。

这种方法有什么缺点吗?我是否导致任何未定义的行为?我尝试了一些极端情况,两种方法的工作方式相似。

在线编译器:https ://wandbox.org/permlink/rkGiwXOUTzqrbMpP

PS 为简洁起见忽略内存泄漏。


更新

已经存在一个与我的as_tokens: strsep几乎相似的函数。在有连续分隔符的情况下有所不同。strsep返回一个空字符串,而as_tokens(即 strtok_r)将它们视为一个。

0 投票
2 回答
533 浏览

c - 为什么 strsep() 不适用于指向堆栈的指针?

strsep使用该函数查找字符串的第一个单词似乎存在指针兼容性问题。到目前为止,我一直认为char *s并且char s[]完全可以互换。但似乎他们不是。我在堆栈上使用数组的程序失败并显示以下消息:

我不明白这个问题。使用的程序malloc有效。

这有效:

这不会:

有什么问题?(对不起strcpy)。为什么函数指针指向堆栈或堆很重要?我理解为什么您不能访问二进制/文本段中的字符串,但是堆栈有什么问题?

0 投票
1 回答
143 浏览

c - 仅在使用 clang 10 编译时 strsep 后的段错误

我正在编写一个解析器(用于 NMEA 句子),它使用 strsep 将字符串拆分为逗号。使用 clang(Apple LLVM 版本 10.0.1)编译时,在拆分具有偶数个标记的字符串时代码会出现段错误。在 Linux 上使用 clang(版本 7.0.1)或 gcc(9.1.1)编译时,代码可以正常工作。

显示该问题的代码的精简版本如下:

段错误发生在 line 上if (!strcasecmp(args[0] + 1, nmea_parsers[i].type)) {,对 args 的索引操作尝试遵循空指针。

通过手动编辑程序集或添加printf("")对函数中任何位置的调用来增加堆栈的大小,使其不再出现段错误,就像使args数组更大(例如,在 中添加一个num_args)。

总之,以下任何一项都可以防止段错误:
- 使用 clang 10 以外的编译器
- 修改程序集以使动态分配之前的堆栈大小为 80 字节或更多(编译为 64)
- 使用奇数的输入字符串标记
- 分配args为具有正确数量的标记(或更多)的固定长度数组
- 分配args为具有至少num_args + 1元素的可变长度数组
请注意,在 Linux 上使用 clang 7 编译时,动态分配之前的堆栈大小仍然是 64 字节,但代码没有段错误。

我希望有人能够解释为什么会发生这种情况,如果有什么方法可以让这个代码用 clang 10 正确编译。

0 投票
2 回答
2438 浏览

c - 使用 Clang 和 MinGW 获取错误“未定义对‘strsep’的引用”

以下是相关代码:

我正在使用带有 minGW 和 Clang 的代码块。

我知道我的一些代码目前没有做它应该做的事情,但我很确定它至少应该编译。我也收到警告:“函数‘strsep’的隐式声明”。

0 投票
0 回答
69 浏览

c - 尝试解析 excel 样式 .CSV 文件时出现分段错误 [C 编程]

在本周的大部分时间里,我一直被困在这个项目上,而我一直在努力解决语法错误。

该项目的要点是通读标题并在某个列处停止并找到某些特征,例如该列的最小值、最大值和平均值。但是,我在为这项工作分配内存时遇到了困难。到目前为止,我一直无法进一步完善我的代码,因为我不断收到一个错误标签Segmentation Fault: 11

粗体部分是我将问题缩小到的部分。我知道存在内存问题,但我不明白为什么 fgets 没有从函数内读取文件的第一行。该文件也不返回 NULL 并且能够被访问。动态数组是一种选择,但我是初学者,对它们非常不熟悉。

excel 文件看起来像这样以供参考在此处输入图像描述

0 投票
0 回答
283 浏览

c - 如何正确使用 strsep() 解析数组?

我正在尝试实现一个函数,该函数接受一个字符串来解析和分隔字符串作为输入,然后返回一个包含这些解析元素的 char 数组,如果两个分隔符相邻,则包括空字符。

以下是我当前的代码:

但是,在测试中我发现这只会返回一个 NULL 字符串,我不知道为什么。没有产生警告或错误,我已经查阅了手册页。

0 投票
0 回答
50 浏览

c - C - Strsep() 返回 0 和负值

我正在一个使用 GPS 数据的项目中工作。我正在尝试获取所有数据,但我遇到了很多问题。我收到的信息是:

我决定使用 strsep,因为它适用于 GPS 数据的空白字段。使用 strsep 如果它是肯定的,我可以正确获取数据。在我的情况下,纬度是负数,使用 strsep 我得到一个 0 值。

我为获取所需数据所做的代码是:

如果您有任何建议,欢迎。