繁体   English   中英

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

[英]Using strcat to add a whitespace onto a string literal?

有没有一种方法可以使用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"

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

如果您的.csv文件已经包含带引号的字段"Lastname, Firstname" ,而这就是您需要从文件中的每一行中进行解析的内容,那么就没有理由将commas为两行,然后尝试将两半引用的字段一起返回。 取而代之的是,只需找到开头'"'将指针保存到行中的开始位置(例如使用char *start; ),然后在行中找到下一个'"' ,将指针保存至行中的结束位置(例如与char *end; ),然后简单地复制从startend为一个新的字符串(记住要NUL,终止新的字符串)

使用来自string.h的函数strchr ,这非常简单。 只需将每一行读入缓冲区:

#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上的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 ,应检查读取的最终字符为'\\n' ,但这要留给您,但请注意,不能保证文件中的最后一行将包含POSIX行尾,因此检查的第二部分将是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"

有很多方法可以做到这一点,包括简单地使用指针在行缓冲区中向下移动并定位和计数'"'或使用strcspn/strspn等。任何可以找到周围引号的方法都可以然后,只需将开头引号复制到结尾引号复制到新字符串中,然后以nul-terminate结束即可。

让我知道您是否正在尝试从文件的每一行中捕获"LastName, Firstname" ,还是您对这种方法而不是strtok方法还有其他疑问,我们很乐意为您提供进一步的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM