【问题标题】:Using scanf to put a variable into an array with C使用scanf将变量放入C数组中
【发布时间】:2013-12-23 09:44:33
【问题描述】:

我目前正在开发一个程序,在该程序中我列出了一个课程并让用户决定他们想参加哪个课程。但是,我遇到了使用 scanf 来确定程序将如何输出所选类的问题。

struct course
{
 char name[7];
 char day[4];
 int hours,houre,mins,mine;
 char ap[3];
 int credit;
};

int main(void)
{
 int s,i,num,cnum,j;
 char l[8][3]={{"st"},{"nd"},{"rd"},{"th"},{"th"},{"th"},{"th"},{"th"}};
 struct course class[]={{"MATH1","MWF",7,8,30,50,"AM",5},
                        {"MATH2","MWF",9,10,00,20,"AM",5},
                        {"CHEM1","MW ",2,6,30,50,"PM",5},
                        {"PHYS4","TTH",4,6,00,45,"PM",4},
                        {"ENGR1","M  ",9,10,30,20,"AM",1},
                        {"ENGR2","TTH",10,12,00,15,"PM",3},
                        {"ENGR3","MW ",11,12,00,15,"PM",3}};

 printf("                 Fall Schedule\n");
 printf("Index  Course  Day        Time       Credit\n");
 printf("-------------------------------------------\n");

 for(i=0;i<7;i++)
   {
     printf("  %i    %s  %s    %i%i:%i%i-%i%i:%i%i%s %i\n",
             i,class[i].name,class[i].day,
             class[i].hours/10,class[i].hours%10,
             class[i].mins/10,class[i].mins%10,
             class[i].houre/10,class[i].houre%10,
             class[i].mine/10,class[i].mine%10,
             class[i].ap,class[i].credit);
   }

 printf("How many classes would you like to take?:\n");
 scanf("%i",&num);

 for(i=0;i<num;i++)
      {
    printf("Select the %i%s class using the index:\n",i+1,l[i]);
    scanf("%i",&j);
      }

 for(i=0;i<num;i++)
  printf("  %i    %s  %s    %i%i:%i%i-%i%i:%i%i%s     %i\n",
          i,class[j].name,class[j].day,
          class[j].hours/10,class[j].hours%10,
          class[j].mins/10,class[j].mins%10,
          class[j].houre/10,class[j].houre%10,
          class[j].mine/10,class[j].mine%10,
          class[j].ap,class[j].credit);
return 0;
}

每次我完成 scanf 时,它都会打印出最后一个选择的值(这是意料之中的,因为我只是将变量重新分配给一个数字)所以我想知道是否有人知道如何缓解这个问题。对代码的风格感到抱歉,我不想在编写 printf 语句时丢失数组的踪迹。我在 %s 和 %i 之间留有空格的原因与程序在显示表格时看起来“不错”有关。 (您可能必须运行代码才能完全知道我要做什么。另外,我没有将最后一个 printf 与前一个 for 循环放在一起的原因是我希望程序如何打印在用户输入了他们想要参加的所有课程后,从日程表中取出。)

【问题讨论】:

  • 请:将参数缩进printf() 不那么深。将格式字符串保留在第一行,并将其余行的参数缩进与格式字符串的开头相同的级别。
  • 用%d而不是%i打印十进制整数。
  • 您可能还喜欢%02d 的两位数小时和分钟,而不是手动提取数字。
  • %i 在 C99 中被允许作为打印十进制整数的替代方式,主要是为了与 scanf() 对称。

标签: c arrays for-loop printf scanf


【解决方案1】:

你需要一个数组来读取选项:

int choice[10] = { 0 };

你需要在scanf()中使用那个数组:

if (scanf("%i", &choice[i]) != 1)
    ...oops...problem reading...

您需要在打印循环中使用该数组:

for (i = 0; i < num; i++)
{
    j = choice[i];
    printf("  %i    %s  %s    %i%i:%i%i-%i%i:%i%i%s     %i\n",
           i, class[j].name, class[j].day,
           class[j].hours/10, class[j].hours%10,
           class[j].mins/10, class[j].mins%10,
           class[j].houre/10, class[j].houre%10,
           class[j].mine/10, class[j].mine%10,
           class[j].ap, class[j].credit);
}

注意printf() 语句的格式。牙刷样式的布局导致代码不可读。我可能会在参数列表中使用更多空格。

【讨论】:

  • 我喜欢您添加新变量以保留数组的方式。肯定会帮助我完成我计划使用该程序执行的其余部分。但是,我不知道您执行 if 语句的那一行是否应该存在,因为您执行了 oops,或者您是否进行了编辑并且只是想让我 scanf("%i",choice[i]) ;并遵循您的其他建议。也对不起格式。我的教授只教我“在每个大括号后使用 3 个空格”,当涉及到很长的 printf 参数时,我不知道该怎么做。
  • SO 上的许多人每级缩进使用 4 个空格;偶尔你会得到 3 或 8 个空间,有些地方每个级别需要 2 个空间(例如,我工作的地方 - ick!)。 if (scanf(...)) 应该是您当前所说的 scanf()。您应该始终检查它是否设法转换了您预期的尽可能多的字段;如果没有,你有问题,需要编写一些错误处理代码,可能终止循环甚至程序,或者刷新未处理的数据,或者......基本上,你需要处理用户的情况输入 'PHYS4' 而不是 4。
  • 啊。当我阅读您的行时,我假设在 if 语句之后它将进入 for 循环。 (如果用户输入了除 1 以外的任何数字,它将进入 for 循环,如果他们选择 1,我将不得不输入一个错误。我没有考虑“PHYS4”的情况,因为我说过使用索引来选择一个类。(在我的 printf 语句中可能应该更清楚一点。)
  • 假设用户会犯错;他们会的。即使你也会犯错。
  • +1 用于“牙刷样式的布局”评论。这对我来说是一个新的。
【解决方案2】:

我想我发现了你的问题。我所做的只是将 J 重新定义为一个数组

   int j[10];

然后改了这段代码

    i,class[j].name,class[j].day,.... ect

到

    class[j[i]].name,class[j[i]].day, ....ect

为我工作。告诉我

【讨论】:

  • 哇,这很有趣。我不知道您可以将数组放入数组中。我在课堂上被教导要分开(对于二维数组等)。非常感谢为我工作。我之前尝试过做类似的事情,但我觉得它好像在做一个二维数组(我认为这是像 j[][] 这样的正确术语。)
  • @Kesakor 这不是“数组中的数组”。对于int j[10];,j[i] 是int,class[j[i]].... 就是class[some_integer]....。现在int j[10];、class[j].... 将是“一个数组到一个数组”,这在 C 中不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多