关于【C语言】中scanf与getchar的用法和常见错误详解1

简介: 关于【C语言】中scanf与getchar的用法和常见错误详解

一.scanf的用法

  • 我们先来看看再MSDN里对scanf的解释

    - scanf 的功能用一句话来概括就是“通过键盘给程序中的变量赋值”。
  • 下面来讲讲它的两种基本用法:

1. scanf(“输入控制符”, 输入参数);

功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。

  • 在通常情况下,我们不希望某个值是由我们程序员指定的,而是在程序运行中由用户从键盘输入的,这更能满足在日常使用时用户的需要,提高我们程序的灵活性
  • 用 scanf 即可实现即可很好的满足我们的要求:
# include <stdio.h>
int main()
{
    int n=0;
    scanf("%d", &n);  //&n 表示取变量 n 的地址,&是取地址符
    printf("n = %d\n", i);
    return 0;
}
  • 上面这个基本的程序中,有以下两点需要注意:
  • (1)我们从键盘输入的全部都是字符。比如从键盘输入 125,它表示的并不是数字 125,而是字符 ‘1’、字符 ‘2’ 和字符 ‘5’。

操作系统在接收键盘数据时会将它当成字符来接收。这时就需要用“输入控制符”把它转化成相应的内容(如%d 是有符号十进制数 %f 是浮点数)。

  • 上面代码中的%d就是要将从键盘输入的这些合法的字符转化成对应的十进制数字。比如经过 %d 转化之后,字符 125 就是数字 125 了。


  • (2)&是一个取地址运算符,&加变量名表示“该变量的地址”,所以&n就表示变量 n 的地址。又称为“取地址n”,相当于将数据存入以变量 n 的地址为地址的变量中(即存入变量n的地址中)。也就是把转化后的数字125放到变量 n 中
  • 总的来说
    scanf 语句的意思就是:从键盘上输入字符 125,然后%d将这三个字符转化成十进制数 125,“&n” 找到变量 n 的地址,把数字 125 放到以变量 n 的地址为地址的变量中,即变量 i 中,所以最终的输出结果就是n=125。

注意:

int main()
{
  char n[20] = {0};
  printf("请输入:>");
  scanf("%s", n);
  }

很多初学者看到这段代码可能会想:这个scanf中没有加&n,会不会是错的?

恭喜你!!!---------------------------------------------------回答错误

我们要透过代码看到其本质,这段代码在使用时,是把输入的字符串放到一个名字为n的char类型的数组的首地址中,而不是变量n中,把输入值放在地址里,当然是对的。

2.scanf(“输入控制符非输入控制符”, 输入参数)

这种用法我是墙裂建议大家在平时敲代码时不要去使用的,因为在使用过程中对用户非常不友好。但咱们这里是介绍用法,还是简单介绍一下,顺便讲讲改进的方法。

# include <stdio.h>
int main(void)
{
    int n;
    scanf("n = %d", &i);
    printf("n = %d\n", i);
    return 0;
}

在 scanf 中,所有的“非输入控制符”都要原样输入。

接下来我来讲讲为什么不推荐使用这种用法

这种输入方法必须满足原样输入,当用户使用时,但凡输入的和你设置的格式有一点不同都不行,哪怕只是多或者少了一个空格。

比如要从键盘给变量 n 赋值 123,那么必须要输入n=123才正确,少一个或者多一个都是错误的。

改进方法:


int main()
{
    int n;
    printf("请输入 n = ");
    scanf("%d", &n);
    printf("n = %d\n", n);
    return 0;
}

通常在输入前我们加上类似“请输入 n = ”这种代码的目的是提示用户应该输入什么内容,改善用户的使用体验。

具体效果

666eda5a3cd049ef8654766fa8764237.png


这样改进既改进了我们的输入格式,又不至于在使用scanf时出错。


输入多个参数

# include <stdio.h>
int main(void)
{
    int m, n;
    scanf("%d%d", &m, &n);
    printf("m = %d, n = %d\n", m, n);
    return 0;
}

通过键盘给多个变量赋值与给一个变量赋值其实是一样的。比如给两个变量赋值就写两个 %d,然后“输入参数”中对应写上两个 “取地址变量” ;给三个变量赋值就写三个 %d,然后“输入参数”中对应写上三个 “取地址变量” ……


从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab 键隔开,用以区分给不同变量赋的值。而且空格、回车或 Tab 键的数量不限。一般使用一个空格即可。


3.scanf的返回值

scanf的返回值我有一篇博客有具体介绍,这里不过多缀叙,博客链接如下:关于C语言中scanf多组输入的实现

二.getchar的用法

1.getchar的返回类型及使用效果

getchar常用来读取字符

以下为msdn中的解释

f231ab9585d044318d037ecb847f45cb.png

int getchar(void)

返回类型为int,参数为void.


getchar返回的其实是字符的ASCII码值(整数)。

getchar在读取结束或者失败的时候,会返回EOF(end of file,本质上是-1.)。

接下来通过代码简单解释一下

#include<stdio.h>
int main()
{
  int n = 0;
  while ((n = getchar()) != EOF)//判断返回值是否是EOF
  {
    putchar(n);//打印输入的n
  }
  return 0;
}

注意:


使用getchar时,每次getchar只会读取一个字符

如果上面的代码不用while循环的话,输入123,putchar就只会输出1。


目录
相关文章
|
3月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
233 88
|
2月前
|
C语言
初识C语言:与计算机的交流之输入与输出(scanf和printf)
初识C语言:与计算机的交流之输入与输出(scanf和printf)
184 0
|
3月前
|
C语言
【C语言基础考研向】05 scanf读取标准输入超详解
本文详细解析了C语言中`scanf`函数的工作原理及常见问题。首先介绍了`scanf`如何处理标准输入,并通过示例说明了为何有时会出现阻塞现象及其解决办法。接着探讨了当输入包含多种数据类型时,特别是字符型数据的处理方式,强调了格式控制的重要性,并给出了正确的输入格式示例。通过正确配置,可以避免因空格和换行符导致的问题,确保数据准确读取。
88 10
|
3月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
3月前
|
C语言
C语言程序设计核心详解 第三章:顺序结构,printf(),scanf()详解
本章介绍顺序结构的基本框架及C语言的标准输入输出。程序从`main()`开始依次执行,框架包括输入、计算和输出三部分。重点讲解了`printf()`与`scanf()`函数:`printf()`用于格式化输出,支持多种占位符;`scanf()`用于格式化输入,需注意普通字符与占位符的区别。此外还介绍了`putchar()`和`getchar()`函数,分别用于输出和接收单个字符。
|
4月前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
178 2
|
4月前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
90 1
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
36 3
|
C语言
c语言中scanf()、printf()函数
  函数调用scanf(“%d”,  &weight) 包含两个参数:“%d” 和&weight。C用逗号来隔开函数调用中的多个参数; 但是printf()和scanf()函数比较特殊,其函数数目可以不受控制。
869 0
|
4天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
26 6