首页 > 其他分享 >scanf 中给 double 用 %f 时赋值异常, float lf, char s 同理

scanf 中给 double 用 %f 时赋值异常, float lf, char s 同理

时间:2024-04-14 15:23:04浏览次数:26  
标签:lf double scanf Enter value char printf usage entered

结论

  1. scanf 的变量要匹配对应的格式化字符串。float f, double lf, char c
  2. 编译器提示的错误要消除,不消除不能运行;同时尽量消除警告

double f

c语言中,给 double 类型的变量用 scanf %f 输入赋值时,会发生逻辑上的错误,请看代码

#include <stdio.h>

int main() {
    double value;
    // 错误的用法
    printf("Enter a double value: ");
    scanf("%f", &value); // 这可能会导致问题
    printf("Incorrect usage: You entered: %lf\n", value);

    // 正确的用法
    printf("Enter a double value: ");
    scanf("%lf", &value);
    printf("Correct usage: You entered: %lf\n", value);
    return 0;
}

运行结果如下:

Enter a double value: 1.234
Incorrect usage: You entered: 0.000000
Enter a double value: 1.234
Correct usage: You entered: 1.234000

可以看到第一次用 f 来输入时,其并没有把 1.234 赋值给变量,输出变量的值是 0.000000。

其实编译器是有警告的: warning: format specifies type 'float *' but the argument has type 'double *' [-Wformat]

float lf

c语言中,给 float 类型的变量用 scanf %lf 输入赋值时,会发生逻辑上的错误,请看代码

#include <stdio.h>

int main() {
    float value;
    // 错误的用法
    printf("Enter a float value: ");
    scanf("%lf", &value); // 这可能会导致问题
    printf("Incorrect usage: You entered: %lf\n", value);

    // 正确的用法
    printf("Enter a float value: ");
    scanf("%f", &value);
    printf("Correct usage: You entered: %lf\n", value);
    return 0;
}

运行结果如下:

Enter a float value: 1.234
Incorrect usage: You entered: -369098.750000
Enter a float value: 1.234
Correct usage: You entered: 1.234000

可以看到第一次用 lf 来输入时,其并没有把 1.234 赋值给变量,输出变量的值是 -369098.750000。两者毫无关系

其实编译器是有警告的:format specifies type 'double *' but the argument has type 'float *' [-Wformat]

char s

c语言中,给 char 类型的变量用 scanf %s 输入赋值时,会发生逻辑上的错误,请看代码

#include <stdio.h>

int main() {
    char value;

    // 错误的用法
    printf("Enter a char value: ");
    scanf("%s", &value); // 这可能会导致问题
    printf("Incorrect usage: You entered: %c\n", value);
    // 正确的用法
    printf("Enter a char value: ");
    scanf("%c", &value);
    printf("Correct usage: You entered: %c\n", value);
    return 0;
}

运行结果如下:

Enter a char value: q
Incorrect usage: You entered: q
Enter a char value: Correct usage: You entered: 

可以看到第一次用 s 来输入时,其把 q 赋值给变量,输出变量的值是 q。但是第二次我都没有输入,就运行结束了,这是为什么呢?则此编译器没有警告了,我们把代码顺序换一下运行就知道为什么了

#include <stdio.h>

int main() {
    char value;
    // 正确的用法
    printf("Enter a char value: ");
    scanf("%c", &value);
    printf("Correct usage: You entered: %c\n", value);
    // 错误的用法
    printf("Enter a char value: ");
    scanf("%s", &value); // 这可能会导致问题
    printf("Incorrect usage: You entered: %c\n", value);
    return 0;
}

运行结果如下:

Enter a char value: ab
Correct usage: You entered: a
Enter a char value: Incorrect usage: You entered: b

可以看到第一次输入 ab 两个字符,第一个字符 a 赋值给 value 了,第二次我没有输入,直接输出了 b,说明第一次只从输入中读取了一个字符。这个时候就可以说明上面最开始用 %s 输入为什么会出问题,上面输入 q 然后回车,q 确实赋值成功了,但第二次没有输入就结束了,因为它把 回车 识别为输入了,也就是说 用 %s 给 char 类型赋值会给后面的赋值留下回车隐患。

标签:lf,double,scanf,Enter,value,char,printf,usage,entered
From: https://www.cnblogs.com/guilinmifen/p/18134181

相关文章

  • 手把手教你做阅读理解提高001-Camping:Finding Myself and Growing Strong-露营:在成长
    PDF格式公众号回复关键字:ZKYDT001阅读理解技巧,在帮助读者有效获取和理解文本信息方面发挥着重要作用,熟练掌握如下6个技巧,可快速突破阅读理解1预览文章结构在开始深入阅读之前,快速浏览文章的标题、段落开头和结尾,可以迅速把握文章的主题、大致内容和结构标题通常能概括文......
  • 基于自注意力机制的轻量级人体姿态估计(Lightweight Human Pose Estimation Based on
    写在前面本文是一篇于2023年3月21日发表在2023InternationalConferenceonBigData,EnvironmentalIndustryandMaterialsScience(ICBDEIMS2023)的一篇会议论文。论文主要聚焦于解决单签人体姿态估计网络模型中普遍存在的参数多、计算复杂度高、检测时间长的问题,文章采用......
  • 论文解读(UGfromer)《Universal Graph Transformer Self-Attention Networks》
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:UniversalGraphTransformerSelf-AttentionNetworks论文作者:论文来源:2022aRxiv论文地址:download论文代码:download视屏讲解:click1-摘要我们引入了一个基于变压器的GNN模型,称为UGfromer,来学习图表示。特别......
  • 32-bit LFSR
    SeeLfsr5forexplanations.Builda32-bitGaloisLFSRwithtapsatbitpositions32,22,2,and1.题目网站moduletop_module(inputclk,inputreset,//Active-highsynchronousresetto32'h1output[31:0]q);reg[31:0]q1;......
  • 5-bit LFSR
    AlinearfeedbackshiftregisterisashiftregisterusuallywithafewXORgatestoproducethenextstateoftheshiftregister.AGaloisLFSRisoneparticulararrangementwherebitpositionswitha"tap"areXORedwiththeoutputbittoprod......
  • ARM DS-5 加载 ELF 文件运行
    1.1.1DS-5工程创建在使用ARMDS-5连接board(或者PFGA)之前首先需要能够扫描到相应的硬件信息,比如对应的cpu的相关信息:coresight相关组件信息,Cache信息等。创建好工程项目后按照下图黄线的指示进行扫描操作(通常是完成扫描后才会去执行“buildplatform”): 如果更换平台......
  • 带有 self 和不带 self 定义的函数有着不同的用途和作用范围
    1.带有self的方法: -带有self的方法通常定义在类中,用于操作类的实例对象(即对象的实例属性和方法)。   -当定义类的方法时,第一个参数通常是self,它代表当前类的实例对象,用于访问类的属性和调用其他方法。   -在调用这类方法时,Python会自动将调用对象作为第一个参......
  • CF1681C Double Sort 题解
    一道普及-我写了两个半小时题面。需要注意的是,每次交换需要将a和b两个数组同时交换,因此便可以想到唯一可行情况:a,b序列数字间的大小关系必须一致。举个例子2462131317970612在上面的例子中,两个序列中任意\(i\)和\(j\)满足\(a_i\lea_j\)时\(b_i......
  • CF1162B Double Matrix 题解
    传送门说句实话,如果不是先写了Showstopper这道题的话,我应该会在这里卡很久,因为做Showstopper我就卡了很久QwQ。思路太像了,实在是太像了,与Showstopper想比,仅仅就是换成二维数组,求最大值变为找递增矩阵,处理方法一模一样:将数组\(a\)和\(b\)中较小的值存在一个数组里,较......
  • Seurat Dimplot, Vlnplot画图时报错,Error in setup_panel_guides(..., self = self) :
    SeuratDimplot,Vlnplot画图时报错,Errorinsetup_panel_guides(...,self=self):unusedargument(list(~features.plot,~id))pdf(paste0("EBV_GaC","_Marker_genes_Vln.png"),width=30,height=10)>DotPlot(object=subset_cells,featur......