【问题标题】:2 Dimensional Array address Book having issues with fgets2 维数组地址簿与 fgets 有问题
【发布时间】:2014-08-02 08:35:23
【问题描述】:

这是我的任务:

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

我得到了大部分,但我的主要问题是 fgets。我不断收到此错误:

warning: passing arg 1 of `fgets' makes pointer from integer without a cast

代码:

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

int main ()
{
    char name[20]= {0};
    char address[40]= {100};
    int choice;
    int i;

    printf("Welcome to the Address Book!\n\n");
    for (i=0;i<10;i++)              //start of the array loop. should give an exit    after each entry
    {
        printf("Would you like to (1)Enter an address, or (2)Print the address book?\n");
        scanf("%i",&choice);
        switch (choice)
        {
            case 1:
            {
                printf("Please enter a name...\n");
                fgets(name[i],20,stdin);
                printf("You entered %s .", name);
                printf("Please enter an address...\n");
                fgets(address[i],40,stdin);
                printf("You enteres %s .", address);
            }
                break;
            case 2:
                for (i = 0; i<10; i ++)
                {
                    printf("%s\n", name[i]);
                    printf("%s\n", address[i]);
                }
                break;
        }
    }
    return (0);
}

【问题讨论】:

  • fgets(name[i],20,stdin); --> fgets(name,20,stdin);fgets(name,sizeof name,stdin);scanf("%i",&amp;choice); 的换行符
  • 你的二维数组在哪里?
  • char name[20]= {0}; --> char name[10][20]= {0};

标签: c arrays 2d scanf fgets


【解决方案1】:

在下面找到更正的代码

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

int main ()
{
    char name[10][20]; //Fix3
    char address[10][40];//Fix4
    int choice;
    int i, j;

    printf("Welcome to the Address Book!\n\n");
    for (i=0;i<10;i++)              //start of the array loop. should give an exit    after each entry
    {
        printf("Would you like to (1)Enter an address, or (2)Print the address book?\n");
        scanf("%i",&choice);
        switch (choice)
        {
            case 1:
            {
                printf("Please enter a name...\n");
                getchar(); //Fix1
                fgets(name[i],20,stdin); 

                printf("You entered %s .", name);
                printf("Please enter an address...\n");
                //getchar();//Fix2

                fgets(address[i],40,stdin);
                printf("You enteres %s .", address);
            }
                break;
            case 2:
            {
                for (j = 0; j<i; j ++)
                {
                    printf("%s\n", name[j]);
                    printf("%s\n", address[j]);
                }
              }
                break;
        }
    }
    return (0);
}

更正如下:

  1. 二维数组用于获取名称和地址
  2. 在使用 fgets() 之前调用 getchar() 来消耗 '\n';

【讨论】:

  • 我会考虑解释一下 OP 做错了什么
  • 你也可以删除数组上的初始化器,将循环索引放入循环中(除非他在 C89 上),删除 getchar(),缩小 choice 的范围,删除额外的范围案例,将printf("%s\n", blah)更改为puts(blah),删除return (0)上的括号,然后我认为它是完美的。
  • scanf("%i\n");应该可以删除getchar()
  • @HerpDerpington,为什么 scanf("%i\n");是必须的 ?请对此进行更多解释。这对我会有帮助。
  • @HerpDerpington "%i\n" :这会导致另一个问题。
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2023-04-11
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多