- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
运行下面的代码时出现段错误。
它基本上应该读取一个超过 3M 行的 .csv
文件,然后再做其他事情(与问题无关),但在 207746 次迭代后它返回一个段错误。如果我删除 p = strsep(&line,"|");
并只打印整个 line
它将打印 >3M 行。
int ReadCSV (int argc, char *argv[]){
char *line = NULL, *p;
unsigned long count = 0;
FILE *data;
if (argc < 2) return 1;
if((data = fopen(argv[1], "r")) == NULL){
printf("the CSV file cannot be open");
exit(0);
}
while (getline(&line, &len, data)>0) {
p = strsep(&line,"|");
printf("Line number: %lu \t p: %s\n", count, p);
count++;
}
free(line);
fclose(data);
return 0;
}
我猜这与内存分配有关,但不知道如何解决。
最佳答案
getline
和strsep
的组合经常会引起混淆,因为这两个函数都会更改您通过指针作为初始参数传递给它们的指针。如果您将已经通过 strsep
的指针再次传递给 getline
,您将面临在第二次迭代中出现未定义行为的风险。
考虑一个例子:getline
将 101 个字节分配给 line
,并将 100 个字符的字符串读入其中。请注意,len
现在设置为 101。您调用 strsep
,它在字符串中间找到 '|'
,因此它指向 line
到以前的 line+50
。现在您再次调用 getline
。它看到另一个 100 个字符的行,并得出结论认为可以将其复制到缓冲区中,因为 len
仍然是 101。但是,由于 line
指向中间现在缓冲区,写入 100 个字符成为未定义的行为。
在调用 strsep
之前复制 line
:
while (getline(&line, &len, data)>0) {
char *copy = line;
p = strsep(©, "|");
printf("Line number: %lu \t p: %s\n", count, p);
count++;
}
现在,您传递给 getline
的 line
会在循环迭代之间保留。
关于c - getline()/strsep() 组合导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48011292/
#include #include #include int main() { char *buf = "2012/9/8"; char sep[] = "/"; char *tok
我正在尝试使用 strsep() 解析文本字符串 (char *),问题是分隔符必须按顺序使用,例如:第一个标记为 ',',第二个标记为 ':'。 . sep = " ,:-,.!."; tofree
我用 C 语言为 simpleShell 程序创建了一个 parseCmd 方法,并将每个参数存储在分隔符空格之前,以存储在我的 args[] 数组中。但是,我试图将参数及其各自的参数添加到链接列表中
strsep 没有正确解析我的字符串。我用""作为分隔符,解析的是单词中间的字符串。我不明白为什么。 代码: #include #include #include #include #defi
#include #include int main() { char *slogan = "together{kaliya} [namak]"; char *slow_gun = strdup(
使用函数 strsep 查找字符串的第一个单词似乎存在指针兼容性问题。到目前为止,我一直认为 char *s 和 char s[] 是完全可以互换的。但似乎他们不是。我在堆栈上使用数组的程序失败并显示
我写了这个函数: char** parse_parameters(const char* input_string, int num_params, char** params) { char
我正在尝试编写一系列将文件名作为输入(例如 main.c)并使用 strsep() 返回文件扩展名的函数。当我运行该程序时,每当调用 strsep 函数时都会出现总线错误。这是代码: static c
当我使用 strsep() 遍历字符串的标记时,存储指向这些标记的指针并在以后引用它们是否安全?示例: char str[] = "some word tokens"; char *sameStr =
运行下面的代码时出现段错误。 它基本上应该读取一个超过 3M 行的 .csv 文件,然后再做其他事情(与问题无关),但在 207746 次迭代后它返回一个段错误。如果我删除 p = strsep(&l
我正在创建一个程序,启动时会使用 scanf 输入命令和一些参数,并使用这些参数调用 execvp。我正在使用 strsep 执行此操作。我将字符串存储在一个数组 (char*) 中,然后我想将其拆分
使用 strsep 拆分包含一堆无用垃圾的 CSV (","Delim)。其中一个条目两边都有引号(即 Florida,"Bob",1999),我想在将它们保存到数组中之前将其取出。 如何删除名称中的
我在用户空间中有一个程序写入内核模块中的 sysfs 文件。我已经隔离出崩溃的根源很可能是这个特定的函数,因为当我在到达这一点之前运行用户代码时它不会崩溃,但是当我添加写入代码时它很可能崩溃。我怀疑我
平台:Linux、OSX 编译器:GCC 我有一个简单的程序,目前让我感到困惑 - 我知道我正在弄乱几种不同类型的数组/指针来产生这个问题 - 它是故意的 - 我试图理解它。 列出的代码将按预期编译和
我正在使用一小段代码来测试较大(初学者)程序的功能,但我在显示从字符串中提取的 token 时遇到问题。 我发现并使用了: #include #include int main() { char
同时使用 getline 和 strsep 时发生内存泄漏。我知道 strsep 修改了 line - 这可能是原因吗?该 line 未正确释放。 FILE *file = fopen("keyw
int main(int argc, char *argv[]) { char *line, buffer[1024]; char *token, *setValue, *po
GCC 8.2.0 未检测到使用 -fsanitize=address 编译的以下代码中的泄漏: #include #include #include int main() {
尝试使用 strsep() 解析逗号分隔值文件时,我得到了一些不需要的输出。它似乎适用于文件的一半,其中一个数字只有一个值(即 0-9),但是一旦添加了多个值,例如 512, 它将打印 512 12
我有以下代码: #include int main(void) { char *buffer = NULL, **words = NULL, *aPtr = NULL, *sPtr;
我是一名优秀的程序员,十分优秀!