使用strcat在字符串文字上添加空格?

时间:2019-06-26 03:54:08

标签: c string csv whitespace

有没有一种方法可以使用strcat向字符串文字添加尾随空格?我正在从csv文件中读取内容,并使用strtok()将其分解为令牌,然后将两个不同的令牌与strcat合并,但是我想做些什么,所以我在两者之间创建了一个空格。

以下是我的csv文件的读取示例:

"LastName, Firstname",ID
"LastName, Firstname",ID
"LastName, Firstname",ID

这是我的代码:

char *firstname_token = NULL, *lastname_token = NULL, *ID_token, line[200];
for (i = 0; i < 3; i++){
fgets(line, 200, infile);
lastname_token = strtok(line," ");
firstname_token = strtok(NULL, ",");
ID_token=strtok(NULL," ");}

当前firstname_token读为:

"Lastname,

当前lastname_token读取:

Firstname"

我想strcat(或类似形式)将它们以以下形式一起使用:

"Lastname, Firstname"

但是保留两者之间的空格,但是我不确定如何保存,因为我不得不将它们最初保存为字符串文字。

1 个答案:

答案 0 :(得分:1)

如果您的.csv文件已经包含带引号的字段"Lastname, Firstname",而这正是您需要从文件的每一行中进行解析的原因,那么就没有理由在{{1 }},然后尝试将引用字段的两半放回去。取而代之的是,只需找到开头commas,将指针保存到行中的开始位置(例如用'"'),然后找到行中的下一个char *start;,将指针保存到结束位置在该行中(例如用'"'表示),然后只需从char *end;复制到start到一个新字符串中(记住要 nul-terminate 新字符串)< / p>

使用end中的函数strchr非常简单。只需将每一行读入缓冲区:

string.h

然后在该行中找到第一个双引号,如果找到,则将地址保存到#define MAXC 256 int main (void) { char buf[MAXC], /* buffer holding line */ name[MAXC]; /* buffer to hold quoted lastname, firstname */ while (fgets (buf, MAXC, stdin)) { /* read each line */ char *start, *end; /* start/end pointers */ 中的左引号:

start

如果找到,则找到结尾 if ((start = strchr (buf, '"'))) /* if start " found */ ,在'"'处开始搜索,并将结束语的地址保存在start + 1中,例如

end

最后,将整个带引号的字段复制到新字符串(例如 if ((end = strchr (start + 1, '"'))) { /* if end " found */

name

将一个简短的示例汇总为一个示例,该示例读取 memcpy (name, start, end - start + 1); /* copy to name */ name[end - start + 1] = 0; /* nul-terminate */ 文件作为.csv上的输入(您可以添加代码以打开文件名),可以这样做:

stdin

注意:为确保完整的输入行适合#include <stdio.h> #include <string.h> #define MAXC 256 int main (void) { char buf[MAXC], /* buffer holding line */ name[MAXC]; /* buffer to hold quoted lastname, firstname */ while (fgets (buf, MAXC, stdin)) { /* read each line */ char *start, *end; /* start/end pointers */ if ((start = strchr (buf, '"'))) /* if start " found */ if ((end = strchr (start + 1, '"'))) { /* if end " found */ memcpy (name, start, end - start + 1); /* copy to name */ name[end - start + 1] = 0; /* nul-terminate */ printf ("%s\n", name); /* print captured name */ } } return 0; } ,您应检查最后读取的字符为buf,该字符留给您,但请注意,因此无法保证文件的最后一行将包含POSIX行尾,因此检查的第二部分将是'\n'。如果满足任一条件,则会从中读取完整的文本行文件)

示例输入文件

您的输入文件,在名称后加上strlen(buf) < MAXC - 1,以区分文件中的行:

1, 2, 3

使用/输出示例

编译和运行代码将仅通过复制所需字符即可保存并输出带引号的字段,而不必将各个部分标记或连接在一起。

$ cat dat/quoted.csv
"LastName1, Firstname1",ID
"LastName2, Firstname2",ID
"LastName3, Firstname3",ID

有很多方法可以做到这一点,包括简单地使用指针在行缓冲区中向下移动并定位和计数$ ./bin/quotedfield < dat/quoted.csv "LastName1, Firstname1" "LastName2, Firstname2" "LastName3, Firstname3" ,或使用'"'等。可以找到周围的报价就可以了。然后只需将开头引号复制到结尾引号复制到新字符串中,然后以nul-terminate结束即可。

让我知道您是否正在尝试从文件的每一行中捕获strcspn/strspn之外的其他方法,或者是否还有其他关于此方法而不是您的"LastName, Firstname"方法的问题,我很高兴进一步帮助。

相关问题