【问题标题】:2D array for a user input name and address用户输入名称和地址的二维数组
【发布时间】:2014-04-11 19:02:34
【问题描述】:

我正在为班级做作业:

创建一个允许用户输入最多 10 个朋友地址的程序。使用二维数组存储朋友的地址。输入每个地址后,用户应该可以选择输入另一个地址或打印一份报告,显示迄今为止输入的每个地址。​​

我创建了一个没有错误的代码,但我没有得到想要的结果。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main ()
{
  char name[10][10] = {0};
  char address[10][10] = {0};
  int choice;

  printf("\n\nWelcome to the address book!\n\n");
  printf("Please enter a name...\n");
  scanf("%s",name);
  printf("Please enter an address...\n");
  scanf("%s",address);

  printf("Would you like to (1)Enter another address, or (2)Print the address book?\n");
  scanf("%i",&choice);
  switch (choice)
  {
    case 1:
        for (int i=0;i<10;i++)
        {
            printf("Please enter a name...\n");
            scanf("%s",name[i]);
            printf("Please enter an address...\n");
            scanf("%s",address[i]);
            printf("Would you like to (1) Enter another address, or (2)Print the address book?\n");
            scanf("%i",&choice);
            if (choice == 1)
            {
                for (int i=0;i<10;i++)
                {
                    printf("Please enter a name...\n");
                    scanf("%s",name[i]);
                    printf("Please enter an address...\n");
                    scanf("%s",address[i]);
                    printf("Would you like to (1) Enter another address, or (2)Print the address book?\n");
                    scanf("%i",&choice);
                }
            } else if (choice == 2)
            {
                for (int i = 0; i<10; i ++)
                {
                    printf("%s\n", name[i]);
                    printf("%s\n", address[i]);
                }
            }
        }
        break;
    case 2:
        for (int i = 0; i<10; i ++)
        {
            printf("%s\n", name[i]);
            printf("%s\n", address[i]);
        }
        break;
}
return (0);
}

我的麻烦来自输出。我能够填充数组,但无法打印我想要的结果。我在哪里丢失了它?

【问题讨论】:

  • 在我第一次输入之后,如果我在“地址”输入中有空格,程序就结束了。我不认为我以正确的方式构建了循环。
  • 理论上应该有2个循环——一个循环不断询问客户是否要显示地址或输入一个,另一个循环显示地址。这里的代码有 4 个循环。所以你是对的,你应该把代码重新排列成两个循环。
  • 感谢您的帮助 Alex,我确实希望您重新阅读我的代码。您正确地认为只有 2 个循环解决了我的大部分问题。不知道如何格式化数组以保存整个字符串。如果我添加空格,它似乎会添加到下一个名称/地址。
  • @Pabeyta 你知道如何完美地使用所有循环(for() , while(), do while()) 吗???
  • @MudassirHussain 正如我所说我是 c 新手。我正在尝试尽可能多地练习。所以我想你的问题的答案是否定的。你为什么要问?我应该使用不同的东西

标签: c arrays loops 2d printf


【解决方案1】:

您的程序看起来有些混乱,但作为您的 C 新手,它是学习过程的一部分。

问题:-

1) 当你的程序第一次启动时,你向用户询问姓名和地址并将它们存储到数组中,好的,那很好。但是当你再次询问同样的事情时(你想做什么...(1)(2) ),您正在使用来自i=0 索引的相同数组,这将覆盖您在程序启动期间输入的名称和地址。您做了同样的事情对于每个循环。它总是会覆盖数组的内容。

2) 其实你的程序叫做 MENU DRIVEN 程序,菜单总是会引导用户做他想做的事,所以你应该这样想,"应该只有一个菜单来引导用户并且应该尝试重用这个菜单,"并且菜单的每个模块应该只做一种类型的事情。

在你的情况下:-

选项(1)应要求用户输入名称和地址以进行存储

选项 (2) 应要求用户打印通讯录。

(但是在您的程序中,您在选项 1 中编写了相同的选项 2 代码,如果您想在选项 1 中执行选项 2,为什么要首先编写选项 2...???..我的意思是如果要执行选项 2,则必须向用户显示相同的菜单。)

执行一个选择后,如果你想再次执行它,你必须把那个选择保留在 一个循环。 (正如我在下面的示例中为 (1) 选择所做的那样。因为我想再次询问用户是否要输入另一个姓名和地址)。

int main ()
{
  char name[10][10] = {0};
  char address[10][10] = {0};
  int choice;
  int i=0;
  char another; //Variable used to store a another choice...

  while(1) //This is infinite loop....
  {
      printf("Would you like to \n(1) Enter Name and address.\n(2) Print the address book? \n(3) Exit\n");
      scanf("%i",&choice);
      switch (choice) //start of switch.....
      {
          case 1: //start of case 1...
          if(i<10) //executes the below code only if i<10 (if array still has empty cells.)
          {
            do
            {
              printf("Please enter a name...\n");
              scanf("%s",name[i]);
              printf("Please enter an address...\n");
              scanf("%s",address[i]);
              printf("\nWant 2 Enter Another name and address...[y/n]:");
              scanf(" %c",&another);
              i++;
            }while((another=='y'||another=='Y'));
          }

         break; //end of case 1...

         case 2: //start of case 2...
            for ( i = 0; i<10; i ++)
            {
                printf("Name: %s\n", name[i]);
                printf("Address: %s\n\n", address[i]);
            }
         break; //End of case 2...

         case 3:
             return 0;  //This ends program when users enter choice 3..

      } //End of switch...
  }//End of while loop..

}//End of Main Function....

【讨论】:

  • 我明白了!那么我在循环中写的问题是什么?我喜欢你添加了一个用户定义的出口。在这种情况下,这可能被证明是有用的。我目前遇到的问题是我的 scanf 不会读取将“Paul Blart”作为两个单独条目读取的空间。我得到的其他建议是使用 fgets。这是最好的方法吗?为什么我会遇到这个问题?
  • 好怀疑,我看到你走在正确的道路上,是的,你的问题是你正在写你的循环,我应该正确地说你试图在案例 1 中做同样的事情,这可能是在案例 2 中完成。对于您的第二个问题,不要使用 fgets(),建议您使用它,但不要使用它,因为它还会读取在输入结束时按 ENTER 键时生成的 '\n' 字符name.使用 scanf() 像这样scanf(" 9[^\n]",name[i]) \\here 9 is sizeof array-1 (to accomadate '\0') and this will read until it finds '\n' (这被称为 scanset 更多信息搜索它)
【解决方案2】:

您应该像其他人编写的一样遵循您的代码,并尝试弄清楚。如果您发现有问题,请修复它。

例如:代码首先询问用户是否要打印或添加地址簿。 如果用户选择添加到通讯录,会有一个循环执行 10 次。在循环中有两个部分要求地址 - 这看起来很复杂,为什么不只问一次呢? (此时修复似乎有问题的地方)。

您还有两个打印地址的地方,将其简化为只打印一次。

最后,这不是你想要的:

  char name[10][10] = {0};
  char address[10][10] = {0};

你想要这个:

  char name[10] = {0};
  char address[10] = {0};

或者你想要的:

  char address[10][2] = {0}; /* address[x][0] is name, address[x][1] is address */

或者你想要 10 个结构的数组。

编辑: 学习编程一开始需要大量的试验和错误。我找到了一个很好的方法来帮助理解程序在做什么,就是用:

printf("1 -\n");
...
printf("2 -\n");
...
etc.

这样,当出现问题时,您就知道从哪里开始寻找。请记住,计算机会完全按照您的指示去做,所以如果它没有给您想要的,说明您解释得不够清楚。

【讨论】:

  • 我想我感到困惑的地方是我需要在每次输入后提供打印数组或广告的选项。我遇到的另一个问题是,在我第一次输入后,如果我选择打印它会正确打印,但如果我选择输入另一个名称和地址,那么打印它就会关闭。
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多