我正在尝试根据用户输入的内容打印出我的数组的所有元素。我认为我没有正确存储它们。
set a,10.5
set
a,10.5
set b,11.5
set
b,11.5
get b
get
b
add e,a,b
add
e,a,b
sub g,a,b
sub
g,a,b
即使我输入了5个不同的名字,它只打印出我输入的最后一个5次。
#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;
}
}
}
任何建议都非常感谢。
答案 0 :(得分:2)
这里为一个长度为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]);
}