C语言的冷门知识(查漏补缺持续更新ing......)

简介: C语言的冷门知识(查漏补缺持续更新ing......)

 目录

前言

1.在特定条件下可以直接输出进制转换

2.不同进制的输入及整体输出

3.易错点之字符串和数组?

(1)理解上的错误:

(2)有什么影响?

(3)sizeof和strlen?


前言

       近些天学习发现C语言有一些以前从未注意过的知识,特此开一新篇记录学习中的心得,欢迎各位在评论补充,持续更新中......

1.在特定条件下可以直接输出进制转换

#include <stdio.h>
int main()
{
    int a=0xABCDEF;
    printf("%15d",a);
    return 0;
}

image.gif

上述代码可以直接输出十六进制转换成十进制的结果,源自于nowcoder基础题。


2.不同进制的输入及整体输出

描述

输入一个十六进制数a,和一个八进制数b,输出a+b的十进制结果(范围-231~231-1)。

输入描述:

一行,一个十六进制数a,和一个八进制数b,中间间隔一个空格。

输出描述:

一行,a+b的十进制结果。

#include <stdio.h>
int main()
{
    int a,b;
    scanf("%x %o",&a,&b);
    printf("%d",a+b);
    return 0;
}

image.gif

重点在于十六进制和八进制的输入方法

题源于nowcoder基础练习BC34

2023.4.21


3.易错点之字符串和数组?

(1)理解上的错误:

在学习中混用了字符串和数组,特在此记录:字符串数组的最后要带有"\0",而数字数组后没有,具体测试可以看如下程序:

#include <stdio.h>
int main()
{
  int arr[20]={1,2,3,4,5};
  char str[20]={"hello"};
  return 0;
}

image.gif

创建了一个字符串,一个数组,我们来调试具体看一下是怎么存储的

image.gif编辑

不难看出,str字符串后才有"\0",而数组则没有,这对我们有什么影响?

(2)有什么影响?

在计算大小的时候会有错误,例如下面代码:

#include <stdio.h>
#include <string.h>
int main()
{
  int arr[] = { 1,2,3,4,5 };
  int len1 = 0;
  int len2 = 0;
  len1 = sizeof(arr) / sizeof(arr[0]);
  len2 = strlen(arr);
  printf("len1=%d\nlen2=%d", len1, len2);
  return 0;
}

image.gif

那么运行结果如下:

image.gif编辑                                                                                            

从中可以发现,strlen函数来计算大小是有问题的,到一些文献里来细看strlen函数:

image.gif编辑

由此可以看到strlen函数对参数的要求是char * str,计算的是beginning of the string and the terminating null character(从开头到结尾的字符串终止符),并且without including the terminating null character itself(不包括结尾字符串"\0")。

(3)sizeof和strlen?

初学者往往仅局限于这两者都是用来计算大小的,但仅局限于此,下面是对这两个函数的一些补充

首先我们要明确的是,sizeof是C语言中保留关键字,也可以认为是一种运算符运算符,单目运算符。

sizeof实际上是获取了数据在内存中所占用的存储空间,以字节为单位来计数。

于是,就有了这样的情景:

#include <stdio.h>
#include <string.h>
int main()
{
  int arr[] = { 1,2,3,4,5 };
  char str[] = {"hello"};
  int len1 = 0;
  int len2 = 0;
  len1 = sizeof(arr);
  len2 = sizeof(str);
  printf("len1=%d\nlen2=%d", len1, len2);
  return 0;
}

image.gif

由于sizeof计算的是数据在内存中占用的存储空间,因此len1和len2的结果是看数组/字符串的内容,注意,这里计算的时候str中是要算"\0"的存在的(空格也算)。

image.gif编辑

但若假设,我们规定了数组和字符串的大小:

#include <stdio.h>
#include <string.h>
int main()
{
  int arr[10] = { 1,2,3,4,5 };
  char str[10] = {"hello"};
  int len1 = 0;
  int len2 = 0;
  len1 = sizeof(arr);
  len2 = sizeof(str);
  printf("len1=%d\nlen2=%d", len1, len2);
  return 0;
}

image.gif

运行结果就截然不同了:

image.gif编辑

这是因为,sizeof计算的是存储空间的大小,而这里和上面不同的是初始化了str和arr的大小,已经提前在内存中开辟了一定的空间,而又因为一般情况下char类型数据占一个字节,int类型占四个字节(也并不都是,一般用的windows下的编译器是这样规定的),因此结果就是4*10和1*10

2023.4.23



相关文章
|
9月前
|
存储 程序员 测试技术
【详解】C语言冷门知识点之--位段
【详解】C语言冷门知识点之--位段
|
9月前
|
C语言
C语言:初阶测试错题(查漏补缺)
C语言:初阶测试错题(查漏补缺)
52 0
|
C语言
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)
|
9月前
|
存储 IDE 编译器
c语言选择题常见知识点汇总 ------持续更新
当使用free释放掉一个指针内容后,指针变量的值不会被置为NULL,free不会更改指针指向、32位系统下任何类型指针的长度都是4个字节、指针的数据类型声明的是指针实际指向内容的数据类型、野指针是指向未分配或者已经释放的内存地址
|
存储 编译器 C语言
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
247 0
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
|
存储 C语言
C语言题目对于输入的一些新思考(持续更新)
C语言题目对于输入的一些新思考(持续更新)
|
算法 C语言
C语言错题锦集(持续更新)
C语言错题锦集(持续更新)
C语言错题锦集(持续更新)
|
算法 C语言
C语言错题锦集(持续更新)
C语言错题锦集(持续更新)
C语言错题锦集(持续更新)
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
62 23
|
1月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
68 15