C 用户输入名称和地址的二维数组

C 用户输入名称和地址的二维数组,c,arrays,loops,2d,printf,C,Arrays,Loops,2d,Printf,我正在做一项课堂作业: 创建一个允许用户输入最多10个朋友地址的程序。使用二维数组存储朋友的地址。输入每个地址后,用户应该可以选择输入另一个地址或打印一份报告,其中显示迄今为止输入的每个地址 我已经创建了一个没有错误的代码,但是我没有得到想要的结果 #include <stdio.h> #include <string.h> #include <stdlib.h> int main () { char name[10][10] = {0}; char

我正在做一项课堂作业:

创建一个允许用户输入最多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);
}
#包括
#包括
#包括
int main()
{
字符名[10][10]={0};
字符地址[10][10]={0};
智力选择;
printf(“\n\n请访问通讯簿!\n\n”);
printf(“请输入名称…\n”);
scanf(“%s”,名称);
printf(“请输入地址…\n”);
scanf(“%s”,地址);
printf(“您想(1)输入其他地址,还是(2)打印通讯簿?\n”);
scanf(“%i”和“选择”);
开关(选择)
{
案例1:

对于(inti=0;i您应该像其他人编写代码一样遵循您的代码,并尝试找出原因。如果您发现错误,请修复它

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

还有两个地方可以打印地址,简化为只打印一次

最后,这不是你想要的:

  char name[10][10] = {0};
  char address[10][10] = {0};
  char address[10][2] = {0}; /* address[x][0] is name, address[x][1] is address */
要么你想要这个:

  char name[10] = {0};
  char address[10] = {0};
或者你想要:

  char name[10][10] = {0};
  char address[10][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.

这样,当出现问题时,你知道从哪里开始寻找。记住,计算机会完全按照你告诉它的去做,所以如果它不能给你想要的东西,你就没有解释清楚。你的程序看起来有些混乱,但作为你的C新手,它是学习过程的一部分

问题:-

1) 当你的程序第一次启动时,你要求用户提供名称和地址,并将它们存储到数组中,好的,这很好。但是当你再次要求相同的事情时(你想做什么…(1)(2)),您使用的是来自
i=0
索引的相同数组,这将覆盖您在程序启动期间输入的名称和地址。并且您对每个循环都做了相同的操作。这将始终覆盖数组的内容

2) 实际上,您的程序被称为菜单驱动程序,其中一个菜单将始终引导用户做他想做的事情,因此您应该这样想,“应该只有一个菜单来引导用户,并且应该尝试重用此菜单,菜单的每个模块应该只做一种类型的事情。

就你而言:

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

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

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

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

int main()
{
字符名[10][10]={0};
字符地址[10][10]={0};
智力选择;
int i=0;
char other;//用于存储另一个选项的变量。。。
while(1)//这是无限循环。。。。
{
printf(“是否要\n(1)输入姓名和地址。\n(2)打印通讯簿?\n(3)退出\n”);
scanf(“%i”和“选择”);
开关(选择)//开关的启动。。。。。
{
案例1://案例1的开始。。。

如果(我猜我感到困惑的地方是,我需要在每次输入后为它提供打印数组或广告的选项。我遇到的另一个问题是,在我第一次输入后,如果我选择正确打印,但如果我选择输入另一个名称和地址,那么打印它就结束了。如果我在“地址"输入程序刚刚结束。我不认为我以正确的方式构造了循环。理论上应该有2个循环-一个循环不断询问客户是否想要显示地址或输入地址,另一个循环显示地址。这里的代码有4个循环。因此,您是对的,您应该将代码重新排列为两个循环。谢谢您的帮助elp Alex,我确实想让你重读我的代码。你的正确意见是,只有2个循环解决了我的大部分问题。不知道如何格式化数组以容纳整个字符串。如果我添加一个空格,它似乎会添加到下一个名称/地址。@Pabeyta你知道如何使用所有循环(for(),while(),Do while())完美???@MudasserHussain正如我所说,我是c新手。我正在尽可能多地练习。所以我想你的问题的答案是否定的。你为什么要问?我应该使用一些不同的东西吗?我看到了!我在循环中写的问题也是如此?我喜欢你添加了一个用户定义的出口。这在这种情况下可能会很有用。T我目前面临的问题是,我的scanf不会读取一个写着“Paul Blart”的空间作为两个独立的条目。我得到的其他建议是使用fgets。这是最好的方法吗?为什么我会有这个问题?很好的疑问,我看到你走在正确的道路上,是的,你的问题是你在循环上写,我应该正确地说,你在案例1中尝试做同样的事情,在案例2中可以做。对于你的2nd问题不要使用fgets(),系统会建议您使用它,但不要使用,因为它也会读取“\n”字符,该字符是在您按ENTER键时生成的