c语言计算日期是该年的第几天

我这个哪里出了问题呀,一在输入的时候输入例如斜杠,就会出现错误,而且计算的天数与我输入的天数相等,并没有计算定义的函数里的天数的计算公式啊

img

img

img

day已经是参数了,在函数里又被当作了统计有多少天的变量,这是不对的
printf("一共有%d天", day_of_year(year, month, day)); 就可以了,你多了一个 day

在scanf输入的时候要按照你设置的%d%d%d的形式输入

供参考:

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7807878
  • 这篇博客你也可以参考下:C语言,输入两个数整用自定义函数求最大公约数
  • 除此之外, 这篇博客: [ C语言 ] 还不懂指针的一定要进来,带你初始指针,简单使用指针,它没有你想的那么难。中的 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    分析:

    int main()
    {
    	float a[5];
    	float* p;
    	for (p = &a[5]; p >= &a[0];)
    	{
    		*--p = 0;
    	}
    	return 0;
    }

     

    改进:

    	for (p = &a[4]; p >= &a[0]; p--)
    	{
    		*p = 0;
    	}

     

    标准规定:
    允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
    指向第一个元素之前的那个内存位置的指针进行比较。

     

     指针 -- 地址
     数组 -- 一组相同类型的数据
    int main()
    {
    	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    	//arr首元素地址
    	int* p = arr;
    	int i = 0;
    	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
    	{
    		printf("%p == %p \n", p + i,&arr[i]);
    	}
    
    
    	return 0;
    }

    分析:

     

    可见数组名和数组首元素的地址是一样的。
    结论:数组名表示的是数组首元素的地址
    那么这样写代码是可行的:
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    int *p = arr;//p存放的是数组首元素的地址
    既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。
    int main()
    {
    	int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
    	int* p = arr; //指针存放数组首元素的地址
    	int sz = sizeof(arr) / sizeof(arr[0]);
    	int i = 0;
    	for (i = 0; i < sz; i++)
    	{
    		printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p + i);
    	}
    	return 0;
    }

     所以 p+i 其实计算的是数组 arr 下标为i的地址

    指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?
    这就是 二级指针
    int main()
    {
    	int a = 10;
    	int* pa = &a;
    	int** ppa = &pa; //ppa就是一个二级指针
    	**ppa = 20;
    	printf("%d\n",a);
    
    	return 0;
    }

  • 您还可以看一下 CSDN讲师老师的C语言精髓之编译过程视频教程课程中的 计算机的组成部分,栈内存的特点;画出内存图,引入指针的概念小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    该问题很可能是因为输入的特殊字符被误认为是日期的一部分了,导致计算出来的日数与输入的日数相等。解决方法是在输入时对特殊字符进行处理,将其过滤掉或者替换掉。具体方法可以在输入的时候使用读取字符串的函数(比如fgets或者scanf)读取整个字符串,然后对字符串进行遍历,遇到特殊字符时将其替换为空格或者去掉该字符。将处理好的字符串传入日期计算函数即可正确计算日期。以下是示例代码:

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    int day_of_year(int year, int month, int day);
    
    int main()
    {
        int year, month, day;
        char buf[256];
    
        printf("请输入日期:");
        fgets(buf, sizeof(buf), stdin);
    
        // 遍历字符串,将特殊字符替换为空格
        for (int i = 0; i < strlen(buf); i++) {
            if (!isdigit(buf[i])) {
                buf[i] = ' ';
            }
        }
    
        // 解析年、月、日
        sscanf(buf, "%d%d%d", &year, &month, &day);
    
        int days = day_of_year(year, month, day);
        printf("该日期是本年第%d天", days);
    
        return 0;
    }
    
    int day_of_year(int year, int month, int day)
    {
        // 检查日期是否合法
        if (year < 1 || month < 1 || month > 12 || day < 1 || day > 31) {
            return -1;
        }
    
        // 计算每个月的天数
        int days[2][12] = {
            {31,28,31,30,31,30,31,31,30,31,30,31},
            {31,29,31,30,31,30,31,31,30,31,30,31},
        };
    
        // 判断是否是闰年
        int leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    
        // 计算天数
        int total = 0;
        for (int i = 0; i < month - 1; i++) {
            total += days[leap][i];
        }
        total += day;
    
        return total;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^