IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 容易忽视C/C++语言中的printf()函数和scanf()函数的返回值 -> 正文阅读

[C++知识库]容易忽视C/C++语言中的printf()函数和scanf()函数的返回值


前言

在讲这两个函数返回值之前我们先看下面这个代码:

  char a = 65;
  int x, y, z,k;
  z = scanf("%d", &y, &z);
  x = printf("%c,%d\n", a, k, a, x, y);

大家是觉得这个程序有错?还是程序正常运行?

这道题的结果和原因我会在下面解释

一、scanf()函数返回值

z = scanf("%d", &y);

这个返回值其实很理解,给你要输入的值分配空间,如果分配成功返回1,否则返回0;可以理解成bool类型。

二、printf()函数的返回值

1.我们先看一下代码和结果

代码

#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
int main()
{
  int k = 115;
  char a = 65;
  int x, y, z;
  x = printf("a,k value is:%c,%d\n", a, k);
  char str1[] = "a,k value is:%c,%d\n";
  string str2 = "a,k value is:%c,%d\n";
  printf("x value is:%d\n", x);
  printf("C string Length: %d\n", strlen(str1));
  printf("C++ string Length: %d\n", str2.length());
  system("pause");
  return 0;
}

解释一下,这里用的是C++,但C++理论上是完全兼容C语言。用C++的原因是因为想知道字符串类型在C++中字符串所占的字节。

程序结果

运行结果
相信看了代码和结果的你和我可能都会得出同一个结论:printf()函数的返回值就是print()函数中的第一个参数:字符数组的长度。
但事实真的如此吗?

2.这个返回值到底是什么?

我们来稍微改动一下上面的代码,我们将第七行的代码中的k赋值为15.我们再来看一下结果是什么?
运行结果
x的值变成了18,但是字符串的长度依旧是19
这个结果直接否定了上面我们上面的结论


3.返回的值到底是什么?

结果查找书籍以及相关资料得到这样一个结论:**printf()的返回值是输出的字符串的字节数。**是不是又觉得这句话和上面得出的结论有点像?
那该怎么理解呢?我们在之前的代码的第10行加两个汉字。

 x = printf("我们a,k value is:%c,%d\n", a, k);

得到的结果

在这里插入图片描述
这里X的值变成了22。因为一个汉字在gbk编码下占两个字节,两个汉字也就是4个字节,22=18+4;
所以其实上面那句话简单的理解就是:
printf()函数返回的值其实是屏幕上输出的值所占的字节数(同时包括换行符等符号所占的字节数)
这里简单的提一下printf()函数的源代码:
在这里插入图片描述
初读这个源代码可能不能得到什么东西,唯一能看懂的可能就是返回值就是一个int类型,但是本质上它的返回值就是在屏幕上输出值所占的字节。
所以如果你用操作运算符sizeof(这里是printf的返回值)得到的答案只与你操作系统对int类型所分配的空间有关!!!



4.解释一下最上面那个问题

首先那个问题的答案:程序会正常执行,但只读到你所指定的值和类型
例如下面这两行执行之后结果就是:给y赋值成功就返回1,并不能给z赋值。输出字符变量a,和整形变量k的值。不会输出剩下的变量a,x,y的值。

 z = scanf("%d", &y, &z);
 x = printf("%c,%d\n", a, k, a, x, y);

但其实相信大家已经看到了上面源代码的截图,看到了其实就更好理解了。注意看:
划线的部分,printf()函数的第二个参数并没有指定只有一个变量(scanf()函数的参数也是一样),所以后面不管是几个变量,只会匹配到你所指定的类型,剩余的没匹配上但程序也并不会报错
在这里插入图片描述

总结

我们在初学C语言时对scanf()和printf()函数用的非常多,但是突然问你它们的返回值可能你就会很懵圈。可能最简单的部分则是我们最容易忽视的点。所以在学了c语言最最主要的部分之后,可以适当的阅读一些封装好的源代码,来帮助自己更好的理解。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:22:53  更:2022-04-18 17:26:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:44:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码