鱼C论坛

 找回密码
 立即注册
查看: 1202|回复: 3

[已解决]这个代码问题出在哪啊

[复制链接]
发表于 2023-9-30 14:57:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码是
#include<stdio.h>
int main()
{
        int n;
        scanf("%d",&n);
        int day,h,m;
        while(n>0)
        {
                scanf("%d %d:%d",&day,&h,&m);
                if(day==0) printf("%d %02d:%02d\n",day,h,m);
        else{
                if(day%2!=0)
                {
                        h=h/2;
                        if(h%2!=0) m=(m+60)/2;
                        if(h%2==0) m=m/2;
                        printf("%d %02d:%02d\n",day,h,m);
                }
                if(day%2==0)
                {        h=h/2;
                        if(h%2!=0) m=(m+60)/2;
                        if(h%2==0) m=m/2;
                        printf("%d %02d:%02d\n",day-1,h+12,m+30);       
                }
        }
                n--;
        }
}
编译结果显示
a.c: In function ‘main’:
a.c:5:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ^~~~~~~~~~~~~~
a.c:9:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d:%d",&day,&h,&m);
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
为什么啊
最佳答案
2023-9-30 14:57:49
这个代码问题出在两个scanf函数调用时没有检查返回值,导致编译器发出警告。scanf函数返回值为成功读入的参数个数,如果返回值不等于期望的参数个数,说明读入失败。在这个代码中,如果读入失败,可能会导致后面的计算和输出出现错误。因此,应该在scanf函数调用后检查返回值,确保读入成功。可以将代码修改为如下形式:
#include<stdio.h>
int main()
{
    int n;
    if(scanf("%d",&n) != 1) {
        printf("Failed to read n\n");
        return 1;
    }
    int day,h,m;
    while(n>0)
    {
        if(scanf("%d %d:%d",&day,&h,&m) != 3) {
            printf("Failed to read day, h, m\n");
            return 1;
        }
        if(day==0) printf("%d %02d:%02d\n",day,h,m);
        else{
            if(day%2!=0) 
            {
                h=h/2;
                if(h%2!=0) m=(m+60)/2;
                if(h%2==0) m=m/2;
                printf("%d %02d:%02d\n",day,h,m);
            }
            if(day%2==0)
            {       h=h/2;
                    if(h%2!=0) m=(m+60)/2;
                    if(h%2==0) m=m/2;
                    printf("%d %02d:%02d\n",day-1,h+12,m+30);     
            }
        }
        n--;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-30 14:57:49 | 显示全部楼层    本楼为最佳答案   
这个代码问题出在两个scanf函数调用时没有检查返回值,导致编译器发出警告。scanf函数返回值为成功读入的参数个数,如果返回值不等于期望的参数个数,说明读入失败。在这个代码中,如果读入失败,可能会导致后面的计算和输出出现错误。因此,应该在scanf函数调用后检查返回值,确保读入成功。可以将代码修改为如下形式:
#include<stdio.h>
int main()
{
    int n;
    if(scanf("%d",&n) != 1) {
        printf("Failed to read n\n");
        return 1;
    }
    int day,h,m;
    while(n>0)
    {
        if(scanf("%d %d:%d",&day,&h,&m) != 3) {
            printf("Failed to read day, h, m\n");
            return 1;
        }
        if(day==0) printf("%d %02d:%02d\n",day,h,m);
        else{
            if(day%2!=0) 
            {
                h=h/2;
                if(h%2!=0) m=(m+60)/2;
                if(h%2==0) m=m/2;
                printf("%d %02d:%02d\n",day,h,m);
            }
            if(day%2==0)
            {       h=h/2;
                    if(h%2!=0) m=(m+60)/2;
                    if(h%2==0) m=m/2;
                    printf("%d %02d:%02d\n",day-1,h+12,m+30);     
            }
        }
        n--;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 14:57:56 | 显示全部楼层
在你的代码中,出现了两个警告:
a.c:5:2: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
^~~~~~~~~~~~~~
a.c:9:3: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d:%d", &day, &h, &m);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~

这些警告是由于你在使用 scanf() 函数时没有检查读入数据是否成功,忽略了函数的返回值。为了避免出现潜在的错误,建议你在使用 scanf() 函数后添加错误检查。

你可以按照以下方式修改代码来解决这个问题:
#include <stdio.h>

int main() {
    int n;
    if (scanf("%d", &n) != 1) {
        printf("Invalid input for N\n");
        return 1;
    }
    int day, h, m;
    while (n > 0) {
        if (scanf("%d %d:%d", &day, &h, &m) != 3) {
            printf("Invalid input for time\n");
            return 1;
        }
        if (day == 0)
            printf("%d %02d:%02d\n", day, h, m);
        else {
            if (day % 2 != 0) {
                h = h / 2;
                if (h % 2 != 0)
                    m = (m + 60) / 2;
                if (h % 2 == 0)
                    m = m / 2;
                printf("%d %02d:%02d\n", day, h, m);
            }
            if (day % 2 == 0) {
                h = h / 2;
                if (h % 2 != 0)
                    m = (m + 60) / 2;
                if (h % 2 == 0)
                    m = m / 2;
                printf("%d %02d:%02d\n", day - 1, h + 12, m + 30);
            }
        }
        n--;
    }
    return 0;
}

在修改后的代码中,我们对 scanf() 函数的返回值进行了检查,确保输入数据的格式正确。如果读入数据失败,则输出错误信息并退出程序。

另外,建议在编写代码时,优先考虑代码的可读性和规范性,使用适当的缩进和空格来提高代码的可读性,使代码更易于理解和调试。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-30 14:58:17 | 显示全部楼层
回答:

在你的代码中,出现了两个警告信息:

1. warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result

这个警告是因为你使用了 scanf 函数但没有检查其返回值。可以通过检查 scanf 的返回值来确保输入的正确性。例如,可以设置一个变量来接收 scanf 的返回值,如果返回值不等于预期的参数数量,说明输入格式错误。

2. warning: control reaches end of non-void function [-Wreturn-type]

这个警告是因为你的 main 函数没有显式地返回一个值。在 C 语言中,main 函数应该声明为 int main(),并且在函数结尾处使用 return 语句返回一个整数值。

下面是修改后的代码:
#include <stdio.h>int main(){    int n;    scanf("%d", &n);    int day, h, m;    while (n > 0)    {        scanf("%d %d:%d", &day, &h, &m);        if (day == 0)        {            printf("%d %02d:%02d\n", day, h, m);        }        else        {            if (day % 2 != 0)            {                h = h / 2;                if (h % 2 != 0)                    m = (m + 60) / 2;                if (h % 2 == 0)                    m = m / 2;                printf("%d %02d:%02d\n", day, h, m);            }            if (day % 2 == 0)            {                h = h / 2;                if (h % 2 != 0)                    m = (m + 60) / 2;                if (h % 2 == 0)                    m = m / 2;                printf("%d %02d:%02d\n", day - 1, h + 12, m + 30);            }        }        n--;    }    return 0;}
注意,不应该在循环内部减少 n 的值,而应该在循环结束之前减少它。另外,可以将变量的声明放在循环外部,以避免在每次迭代中重新定义和初始化它们。

另外,这个代码逻辑上存在一些问题。例如,第二个 if (day%2==0) 是无条件地执行的,应该改为 else if (day%2==0),以确保只有在第一个条件不满足时才会执行。此外,还有一些边界情况需要考虑,如小时和分钟超过 24 或者 60 的情况。

希望这能帮助到您!

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表