繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM