首页 > 解决方案 > 全局 char *array 被覆盖

问题描述

我试图char *在 C 中使用全局声明的数组来存储一些名称,但是,在成功写入正确的值后,整个数组将被最后输入的值覆盖。我希望能够从into存储char数组,当我运行函数时一切看起来都很好,但是如果我运行我注意到数组上的每个空间都被最后一个值覆盖,为什么?stdinchar *names[]readNamesprintNames

#include <stdio.h>

#define NUM_OF_NAMES 20
#define NAME_SIZE 15

int readNames(int);
int readName(int);
int sortNames();
int printNames();

char* names[NUM_OF_NAMES];
char nameHolder[NAME_SIZE];

int main () {
    readNames(NUM_OF_NAMES);
    printf("\n");
    printNames();
    return 0;
}

int readNames(int qty) {
    for ( int i = 0; i < qty; i++ ) {
        readName(i);
        printf("%s \n", names[i]);
    }
    return 0;
}

int readName() {
    char c;
    for ( int i = 0; i < NAME_SIZE; i++ )
        nameHolder[i] = '\0';
    for ( int i = 0; i < NAME_SIZE; i++ ) {
        c = getchar();
        if ( (c == '\"') || (c == 32) )
            c = getchar();
        if (c == ','){
            names[target] = nameHolder;
            return 0;
        }
        nameHolder[i] = c;
    }
    names[target] = nameHolder;
    return 0;
}

int sortNames() {
    return 0;
}

int printNames() {
    for ( int i = 0; i < NUM_OF_NAMES; i++ ) {
        printf("%s \n", names[i]);
    }
    return 0;
}

输出:

MARY  PATRICIA  LINDA  BARBARA  ELIZABETH  JENNIFER 
MARIA  SUSAN  MARGARET  DOROTHY  LISA  NANCY  KAREN  BETTY  HELEN 
SANDRA  DONNA  CAROL  RUTH  SHARON 

SHARON  SHARON  SHARON  SHARON  SHARON  SHARON  SHARON  SHARON  SHARON
SHARON  SHARON  SHARON  SHARON  SHARON  SHARON  SHARON  SHARON  SHARON
SHARON  SHARON

char *我尝试通过在每个元素上写入字符来初始化数组,15但结果是一样的,不知道这里发生了什么,还有什么我可以尝试的吗?最好不使用额外的库?

标签: carrays

解决方案


你在这里声明了两个对象:

char* names[NUM_OF_NAMES];
char nameHolder[NAME_SIZE];

第一个是指针数组,第二个是字符数组。

您的代码始终写入第二个数组,然后将第一个数组中的一个指针设置为指向第二个数组。所以最后,所有的指针都指向同一个对象nameHolder

一个简单的解决方法是使用二维数组,如下所示:

char names[NUM_OF_NAMES][NAME_SIZE];

然后在阅读某些内容时直接写入names[i](或类似的,names[i][j]如果您编写单个字符)。

您也可以使用 . 单独分配每个名称malloc()


推荐阅读