【问题标题】:How to print the days of the week using a structure member?如何使用结构成员打印星期几?
【发布时间】:2019-03-06 08:21:19
【问题描述】:

我想在这个程序中打印星期几,但它不起作用,我该怎么做才能解决它?

#include<stdio.h>
struct month{
    int date[12];
    char day[7];
}mon;
main()
{   int i;

    strcpy(mon.day[0],"Sunday");
    strcpy(mon.day[1],"Monday");
    strcpy(mon.day[2],"Tuesday");
    strcpy(mon.day[3],"Wednesday");
    strcpy(mon.day[4],"Thursday");
    strcpy(mon.day[5],"Friday");
    strcpy(mon.day[6],"Saturday");

    for(i=0;i<7;i++)
    {
        printf("Day %d is %c\n",i+1,mon.day[i]);
    }

}

【问题讨论】:

  • strcpy(mon.day[0],"Sunday"); --- 问题!!
  • 编译器应该对你发出警告。什么是例如mon.day[2]?它真的是一个字符串(可以用作strcpy的目的地),还是一个单个字符(就像你打印的那样)?
  • printf("Day %d is %c\n",i+1,mon.day[i]); } => printf("Day %d is %s\n",i+1,mon.day); }
  • char day[7] - 它是 7 个字符。不是 7 个字符串,不是 7 个字符指针,仅此而已。只有 7 个字符(字节)。你也会溢出 strcpy 中的所有内容。
  • 与您的问题无关,但请阅读例如this main function reference。您对main 的声明无效。

标签: c arrays structure


【解决方案1】:

您正在尝试将字符串存储在 char 中。但是,字符串是char 的数组。而不是这个:

char day[7];

你需要这样的东西:

char day[7][16];

现在您有 16 个char 可以容纳一个工作日,并且您有 7 次,每天一个。另外,您的打印错误。要打印字符串,您需要%s,而不是%c%c 仅用于一个字符:

printf("Day %d is %s\n", i + 1, mon.day[i]);

另一种方法是使用char* 数组而不是char,并且只存储字符串的地址而不是复制字符串:

char *day[7];

然后像这样存储地址:

mon.day[0] = "Sunday";
mon.day[1] = "Monday";
mon.day[2] = "Tuesday";
...

用同样的方式打印出来,%s

【讨论】:

    【解决方案2】:

    如果你试图编译你的程序,你的编译器会给你一些警告。喜欢

    • 问题一:

      source_file.c:10:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
       main()
       ^
      

      main() 的正确签名是 int main(void),对于通常的托管环境。

    • 问题 2:

      source_file.c: In function ‘main’:
      source_file.c:13:5: warning: implicit declaration of function ‘strcpy’ [-Wimplicit-function-declaration]
           strcpy(mon.day[0],"Sunday");
           ^
      source_file.c:13:5: warning: incompatible implicit declaration of built-in function ‘strcpy’
      source_file.c:13:5: note: include ‘<string.h>’ or provide a declaration of ‘strcpy’
      

      您需要包含 string.h 头文件,其中包含 strcpy() 的声明。

    • 问题 3:

      source_file.c:13:12: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
           strcpy(mon.day[0],"Sunday");
      

      这表明,strcpy() 的第一个参数需要 char *,但您传递的是 char,转换为 int

      这是最重要的一点,如您所见,您需要传递一个 缓冲区,其中可以包含复制字符串中的内容。周四,你需要

    • day 成为二维数组

    • 使用day[i]存储内容
    • 使用%s打印其内容。

    【讨论】:

      【解决方案3】:

      对于像 day 和 month 这样的常量,最好像下面这样构造,除非你正在练习 struct。

      #include<stdio.h>
      int main()
      {   
          const char *day[] = {"Sunday", "Monday", "Tuesday","Wednesday", "Thursday", "Friday", "Saturday" };
                    //^^^^^ array of strings.
          for(int i=0;i<7;i++)
              printf("Day %d is %s\n",i+1,day[i]);
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-08-09
        • 1970-01-01
        • 2020-05-06
        • 2012-08-30
        • 1970-01-01
        • 2021-05-17
        • 2011-12-19
        • 1970-01-01
        • 2013-01-09
        相关资源
        最近更新 更多