繁体   English   中英

将字符串组合到C中的列表中

[英]Combining Strings into a List in C

以下是我的以下问题的代码。 我正在尝试使用逗号分隔的一串名字和姓氏字符串,并将它们转换为全名列表。 例如,如果firstnames = "John,Jane"lastnames = "Smith,Doe" ,则输出应为["John Smith", "Jane Doe"]

我相信我的问题出现在我使用strtok因为first_names[i] = name给了我一个错误。 任何有关这方面的帮助将非常感谢!

char **combine_names(char *firstnames, char *lastnames) {
    char first_names[50][50];
    char last_names[50][50];
    int i = 0;
    char *name = strtok(firstnames, ",");
    while (name != NULL) {
        first_names[i] = name;
        i++;
        name = strtok(NULL, ",");
    }
    i = 0;
    name = strtok(lastnames, ",");
    while (name != NULL) {
        last_names[i] = name;
        i++;
        name = strtok(NULL, ",");
    }
    char **names;
    names = malloc(strlen(first_names) * sizeof(char*));
    for (int i = 0; i < strlen(first_names); i++) {
        names[i] = malloc(51 * sizeof(char));
    }
    int i = 0;
    int j = 0;
    int k = 0;
    while (first_names[i] != '\0') {
        while (first_names[i][j] != '\0') {
            names[i][j] = first_names[i][j];
            j++;
        }
        names[i][j] = ' ';
        j++;
        while (second_names[i][k] != '\0') {
            names[i][j] = second_names[i][k];
            j++;
            k++;
        }
        names[i][j] = '\0';
        i++;
    }
    names[i] = '\0';
    return names;
}

以下行导致第一个参数出现不兼容的指针错误。 这是为什么?

names = malloc(strlen(first_names) * sizeof(char*));

使用strtok()确实会带来一些问题,但主要问题是你使用无效的表达式malloc(strlen(first_names) * sizeof(char*));分配names malloc(strlen(first_names) * sizeof(char*)); first_names不是C字符串, strlen(first_names)不计算first_names数组中的条目数。

这是一种更简单,更安全的方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **combine_names(const char *firstnames, const char *lastnames) {
    int n = 0;
    char **names = malloc(sizeof(*names) * (n + 1));
    char *p;

    if (names == NULL) {
        perror("cannot allocate memory\n");
    }

    while (*firstnames && *lastnames) {
        int len1 = strcspn(firstnames, ",");
        int len2 = strcspn(lastnames, ",");
        int size = len1 + 1 + len2 + 1;
        p = malloc(size);
        if (p == NULL) {
            perror("cannot allocate memory\n");
        }
        snprintf(p, size, "%.*s%s%.*s",
                 len1, firstnames,
                 len1 && len2 ? " " : "",
                 len2, lastnames);
        names = realloc(names, sizeof(*names) * (n + 2));
        if (names == NULL) {
            perror("cannot allocate memory\n");
        }
        names[n++] = p;
        firstnames += len1 + (firstnames[len1] == ',');
        lastnames += len2 + (lastnames[len2] == ',');
    }
    names[n] = NULL;
    return names;
}

请记住, first_names是一个双字符数组。 这意味着first_names[i]实际上是一个字符串或一个字符数组。 您不能直接分配给字符数组,而是必须逐个字符地写入数组。 最简单的方法是使用字符串复制或strcpy(first_names[i], name) ,但strcpy不能防止缓冲区溢出。 一种方法是使用strncpy ,只是要小心,因为当源字符串超过目标字符串的大小时,这不能保证字符串以空值终止。 要解决此问题,请使用

strncpy(first_names[i], name, 50);
first_names[i][49] = '\0';

考虑到strncpy的缺点,最好使用类似于@chqrlie的解决方案。

暂无
暂无

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

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