[英]Storing/accessing next element in string array in C
我正在尝试根据用户输入的内容打印出数组中的所有元素。 我认为我没有正确存储它们。
#include <stdio.h>
int x = 0;
int iChoice = 1;
char cNames[255];
char *iNames[5];
int main()
{
while (x >= 0 || iChoice == 1) {
printf("\nPlease enter a name: ");
scanf(" %s", cNames);
iNames[x] = cNames;
printf("Name One: %s", iNames[x]);
x++;
if (x > 0) {
printf("\n\n\tMenu\n");
printf("\t****\n\n");
printf("\t1. Enter another name\n\t2. Print report\n\n");
printf("Enter selection: ");
scanf("%d", &iChoice);
}
if (iChoice == 2) {
for (x = 0; x < 5; x++) {
printf("Name Two: %s\n", iNames[x]);
}
break;
}
}
}
即使我输入了5个不同的名称,它也只打印出我输入5次的最后一个名称。
Name Two: Mike
Name Two: Mike
Name Two: Mike
Name Two: Mike
Name Two: Mike
任何建议,不胜感激。
在这里,您为一个长度为255个字符的字符串分配内存:
char cNames[255];
假设该字符串存在于内存地址42
。
在这里,您在地址42
的字符串中读取了一个字符序列:
scanf(" %s", cNames);
如果用户输入名称“ Joe”,则从内存地址42
开始的字节序列如下所示:
Joe\0
现在,我们将字符串的地址存储在指针数组中:
iNames[x] = cNames;
iNames[0]
现在看起来像这样(从技术上讲,这些零实际上是随机数,因为我们尚未设置其值):
{ 42, 0, 0, 0, 0 }
现在我们循环,并从用户那里读取另一个字符序列:
scanf(" %s", cNames);
这里会发生什么? cNames
仍然是内存地址42
处的单个字符串。 如果用户输入名称“ Bob”,则从内存地址42开始的字节序列如下所示:
Bob\0
“乔”这个名字怎么了? 我们改写了它。 iNames指针数组不存储字符串“ Joe”; 它存储存储器地址42
。 我们改写了该内存地址的字节序列。
程序完成后,最终将得到如下所示的指针数组:
{ 42, 42, 42, 42, 42 }
要解决此问题,您需要确保为尝试读取的每个字符串分配一个内存块。执行以下操作以从用户读取字符串:
char *str = malloc(sizeof(char) * 255);
scanf(" %s", str);
iNames[x] = str;
...并且在程序完成后可以进行以下清理:
for (int i = 0; i < 5; ++i) {
free(iNames[i]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.