在C中存储/访问字符串数组中的下一个元素

时间:2015-12-16 18:27:48

标签: c arrays loops

我正在尝试根据用户输入的内容打印出我的数组的所有元素。我认为我没有正确存储它们。

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;
      }
   }
}

任何建议都非常感谢。

1 个答案:

答案 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]);
}