20201207-C语言-关于PTA刷题时的注意事项

关于PTA刷题时的注意事项

1出错信息

具体信息

问题:
mulsendc.c: In function ‘main’:
mulsendc.c:14:9: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
这句警告是什么意思?顺便问一句,这些内容从哪里可以查到?

可能的相应代码


#include<stdio.h>
#include "mpi.h"

int main(int argc,char** argv)
{
    
    
	int rank,value,size;
	MPI_Status status;
	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
	MPI_Comm_size(MPI_COMM_WORLD,&size);
	do{
    
    
		if(rank==0){
    
    
			fprintf(stderr,"\nPlease give new value=");
			scanf("%d",&value);
       
       ///
		MPI_Finalize();
	}
//gcc源码里面可以搜索到这警告
/*
最好不用scanf,一是避免scanf的第二个参数溢出(按照字符串格式化输入的时候);二是避免输入的格式错误。

因此我一般是使用getchar读取若干个字符(自己限定读入的格式,然后读取指定字符时结束读入),然后按照自己理解(要求用户输入肯定知道输入的类型)的类型进行类型转换,同时判断转换是否成功。然后根据转换成功与否决定后面的程序是否继续。

*/
        
/*
The writer's of your lib-c have decided that the return value of scanf should not be ignored in most cases, so they have given it an attribute telling the compiler to give you a warning.

If the return value is truly not needed, then you are fine. However, it is usually best to check it to make sure you actually successfully read what you think you did.
*/

PTA刷题时总是出现如标题所示的报错——警告: 忽略‘ scanf’的返回值,用属性 warn_unused_result 声明之类的,于是对出现报错的原因和解决方法做了查阅。

原因

我们经常也能在编译器中看到到未处理scanf返回值的警告,但我们往往选择忽略,PTA太严格了!只有解决这个警告,无奈~
首先scanf 函数的返回值反映了按照指定的格式符正确读入的数据的个数。不一定等于得到输入值的输入项的个数,也不是进入缓冲区的数据的个数。
如果输入数据与指定格式不符,则会产生输入错误。遇到输入错误,scanf函数会立即终止,返回已经成功读取的数据(即正确读入)的个数。
所以,通过scanf函数的返回值和指定输入数据的个数(由格式符决定)的比较,可以判断数据输入是否成功。
j就安全性来说在大多数情况下不应忽略 scanf 的返回值,所以他们给了它一个属性 warn_unused_result ,告诉编译器给你一个警告,如果返回值真的不需要,那么就没问题。不过,通常最好检查一下,以确保你确实成功地读取了你认为自己读取的内容。

解决办法

附上大佬多种解决方法,后几种更加简单,建议大家阅读每种方法代码上面的英文解释,能够更加清晰得了解到为什么这样一句就能解决/屏蔽这个warning,链接如下。

具体实例2

pta上写代码提交后会出现ignoring return value of ‘scanf’, declared with attribute warn_unused_result的警告,

并不是错误,但是看起来不爽,

原因是scanf的返回值没有被使用造成的,因为返回值为1时代表输入成功,返回值为0说明输入错误,类型不匹配,比如需要int类型但却输入了个字符串,所以可以根据返回值结果添加错误提示,这样就使用了scanf的返回值,就不会报警告了

之前的源码

#include <stdio.h>
 
int main(int argc, const char * argv[]) {
    
    
 
    int k;
    scanf("%d",&k);	// 只拿来做输入,并没有使用它的返回值
    int arr[k];
    for(int i = 0;i<k;i++){
    
    
        scanf("%d",&arr[i]); // 只拿来做输入,并没有使用它的返回值
    }
    int sum=0,maxSum = 0;
    
    for(int j = 0;j<k;j++){
    
    
        sum += arr[j];
        if(sum > maxSum){
    
    
            maxSum = sum;
        }else if(sum < 0){
    
    
            sum = 0;
        }
    }
    
    printf("%d\n",maxSum); // 只拿来做输出,并没有使用它的返回值
    
    return 0;
}

解决之道

进行防御性程序设计,多给if判断

  • 这里要求输入一个整数
    • 有可能用户不有输入对
    • 有可能输入的数不能够成整数,或是十进制的整数
    • 有可能输入有非法的情况
    • 有可能就在输入时,系统出错
    • 等各种可能
    • 所以要进行判断,在输入正确合法的情况下,再进行其它动作
#include <stdio.h>
 
int main() {
    
    
 
    int k;
    if(scanf("%d",&k) != 1){
    
    	// 使用更严格的方式来使用输入和输出
        printf("请输入整数!");
    }
    int arr[k];
    for(int i = 0;i<k;i++){
    
    
        if(scanf("%d",&arr[i]) != 1){
    
    // 使用更严格的方式来使用输入和输出
            printf("请输入整数!");
        }
    }
    int sum=0,maxSum = 0;
    
    for(int j = 0;j<k;j++){
    
    
        sum += arr[j];
        if(sum > maxSum){
    
    
            maxSum = sum;
        }else if(sum < 0){
    
    
            sum = 0;
        }
    }
    
    printf("%d\n",maxSum);
    
    return 0;
}

读懂题目要求和提示

如果不需要,则不用管它

例如,这里只是一个警告,而且源代码部分,不用程序员来管理

已经显示程序正确了,就不用管了

在这里插入图片描述

  • 这里的出错,不用纠结
    在这里插入图片描述

知道是什么原因就足够了

猜你喜欢

转载自blog.csdn.net/matrixbbs/article/details/110801138