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



相关文章
|
3月前
|
存储 程序员 测试技术
【详解】C语言冷门知识点之--位段
【详解】C语言冷门知识点之--位段
|
3月前
|
C语言
C语言:初阶测试错题(查漏补缺)
C语言:初阶测试错题(查漏补缺)
30 0
|
9月前
|
C语言
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)
C语言初阶 牛客网刷题笔记(将持续更新..)
|
3月前
|
存储 IDE 编译器
c语言选择题常见知识点汇总 ------持续更新
当使用free释放掉一个指针内容后,指针变量的值不会被置为NULL,free不会更改指针指向、32位系统下任何类型指针的长度都是4个字节、指针的数据类型声明的是指针实际指向内容的数据类型、野指针是指向未分配或者已经释放的内存地址
|
存储 编译器 C语言
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
196 0
C语言数据类型类型及语句(各种详细的细节以及基础+持续更新中
|
存储 C语言
C语言题目对于输入的一些新思考(持续更新)
C语言题目对于输入的一些新思考(持续更新)
|
算法 C语言
C语言错题锦集(持续更新)
C语言错题锦集(持续更新)
C语言错题锦集(持续更新)
|
算法 C语言
C语言错题锦集(持续更新)
C语言错题锦集(持续更新)
C语言错题锦集(持续更新)
|
6天前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
1天前
|
编译器 程序员 C语言
【C语言篇】从零带你全面了解函数(包括隐式声明等)(下篇)
⼀般情况下,企业中我们写代码时候,代码可能⽐较多,不会将所有的代码都放在⼀个⽂件中;我们往往会根据程序的功能,将代码拆分放在多个⽂件中。