c - c - 从 csv 文件中读取和更改字符串
问题描述
所以我在excel中打开了一个csv文件,我试图复制该文件中的所有内容并将其写入一个带有更改的新文件中。我有第四列,每行都填满了一种特定的食物,我想改变它,使它只打印出新文件中每种食物的第一个字母。像“肉丸”应该打印为“M”。问题是我不断收到分段错误,我不知道是什么原因造成的。我花了几个小时试图解决这个简单的问题,但没有成功。任何帮助,将不胜感激。
char readLine[lineCount];
while(fgets(readLine, lineCount, fd)) {
char* tmp = strdup(readLine);
if(strcmp(getfield(tmp, 1), "Food") == 0){
if(strcmp(getfield(tmp, 4), "Meatballs") == 0){
fprintf(ft, "%c,", 'M');
}else if(strcmp(getfield(tmp, 4), "Icecream") == 0){
fprintf(ft, "%c,", 'I');
}
}
fprintf(ft, "\n");
free(tmp);
}
获取字段功能:
const char* getfield(char* line, int num){
const char* tok;
while(tok = strsep(&line, ","))
{
if(!--num) {
printf("%s\n", tok);
return tok;
}
}
return NULL;
}
解决方案
您的问题与 strsep 函数有关。strsep 对char**
传递给它的 that 进行变异,以便在每次调用时都返回令牌,并且char**
包含字符串的其余部分减去令牌和分隔符。对此的解决方案是不使用 strsep 或在调用之前复制字符串
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char* getfield(const char *line, int num){
const char* tok;
char *dup_line, *tofree;
dup_line = tofree = strdup(line);
while(tok = strsep(&dup_line, ","))
{
if(!--num){
free(tofree);
return tok;
}
}
free(tofree);
return NULL;
}
int main(int argc, char *argv[])
{
char *record = "foo,bar,foobar,barfoo";
printf("%s\n", getfield(record, 3));
printf("%s\n", getfield(record, 1));
}
印刷foobar\nfoo\n
推荐阅读
- python - Python哪个模块最适合在图像中显示矩形?
- ios - WidgetExtension Swift 中的 CoreData
- flutter - 如何在flutter中上传到firebase存储和数据库之前压缩pdf文档
- firebase - Flutter firestore - 更新键为 url 的单个地图条目
- php - 根据送货国家/地区在 WooCommerce 结帐中显示自定义消息
- r - r:操作数据,使具有相同值的列以特定方式组合
- sed - 替换单词,但只能在冒号之后
- html - 如何将 ngx modal 设置为屏幕中间?
- javascript - javascript没有以某种方式运行
- javascript - 如果代理使用 Live Chat Inc 离线,则隐藏 div