簡體   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