c - 全局 char *array 被覆盖
问题描述
我试图char *
在 C 中使用全局声明的数组来存储一些名称,但是,在成功写入正确的值后,整个数组将被最后输入的值覆盖。我希望能够从into存储char
数组,当我运行函数时一切看起来都很好,但是如果我运行我注意到数组上的每个空间都被最后一个值覆盖,为什么?stdin
char *names[]
readNames
printNames
#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
但结果是一样的,不知道这里发生了什么,还有什么我可以尝试的吗?最好不使用额外的库?
解决方案
你在这里声明了两个对象:
char* names[NUM_OF_NAMES];
char nameHolder[NAME_SIZE];
第一个是指针数组,第二个是字符数组。
您的代码始终写入第二个数组,然后将第一个数组中的一个指针设置为指向第二个数组。所以最后,所有的指针都指向同一个对象nameHolder
。
一个简单的解决方法是使用二维数组,如下所示:
char names[NUM_OF_NAMES][NAME_SIZE];
然后在阅读某些内容时直接写入names[i]
(或类似的,names[i][j]
如果您编写单个字符)。
您也可以使用 . 单独分配每个名称malloc()
。
推荐阅读
- vb6 - 聊天机器人的新线
- javascript - 如何 - 提高我的代码性能以从数组中获取唯一值 - Javascript
- c++ - 使用 SCH_CRED_FORMAT_CERT_HASH 时,AcquireCredentialsHandle 在内核模式下失败
- python - 将列表列表的列表转换为字典
- c# - 在 MS BotFramework 中使用 PromptDialog 开始对话
- laravel - 当父级不存在时,Laravel hasMany
- c++ - 缺少 Qt5PrintSupportd.dll
- java - 将本机查询转换为 JPQL
- spring-boot - Kinesis 作为 Spring Boot Reactive Stream API 中的生产者
- vba - 在另一个 Sub 中编辑一个 Sub