C语言-一些tips

本文详细介绍了C语言中的基本概念,如数据单位、变量类型、作用域、输入输出、字符操作、数组处理、控制结构、文件I/O、数据转换、字符串操作和C++特性如typedef等,旨在帮助初学者理解C语言的核心原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1.计算机中的单位

bit-比特位(最小的储存单位--二进制中储存一个1或0的大小

byte-字节=8bit

kb=1024byte

mb gb tb pb依次1024倍

2.常见关键字

3.局部变量和全局变量冲突时,局部变量优先;局部变量的作用域是变量所在的局部范围.
4.extern的直接使用是在同样一个源文件里面(vs里可以直接创建)

5.变量要记得初始化,不然默认随机值,定义数组的时候也一样。
6.字符数组的输出

7.计算含转义字符的字符串长度

8.输入未知个数数组时

int a[]={一堆数字};

int n = sizeof a /sizeof a[0]; n 整个数组大小除以第一个元素的大小(最好是除以a[0],数组至少有一个数据)就是个数。

*9.大小写相互转换
单个字符
  1. A(65)—Z(90)、B—Y 大写字母ASCII之和为152

  2. A—a: s[i]=s[i]-'A'+'a';

  3. scanf和getchar函数
关于缓冲区的理解: 

        在 scanf 函数中,从键盘输入的一切数据,不管是数字、字母,还是空格、回车、Tab 等字符,都会被当作数据存入缓冲区。存储的顺序是先输入的排前面,后输入的依次往后排。按下回车键的时候 scanf 开始进入缓冲区取数据,从前往后依次取。   

        如果 scanf 函数中仅有 %d ,则 scanf 函数只识别“十进制整数”。对 %d 而言,空格、回车、Tab 键都是区分数据与数据的分隔符。当 scanf 函数进入缓冲区中取数据的时候,如果 %d 遇到空格、回车、Tab 键,那么它并不取用,而是跳过继续往后取后面的数据,直到取到“十进制整数”为止。对于被跳过和取出的数据,系统会将它从缓冲区中释放掉。未被跳过或取出的数据,系统会将它一直放在缓冲区中,直到下一个 scanf 来获取。但是如果 %d 遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出。   

        如果将 %d 换成 %c,那么任何数据都会被当作一个字符,不管是数字还是空格、回车、Tab 键它都会取回
————————————————
版权声明:本文为优快云博主「Green_Gables」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/Green_Gables/article/details/118766849

所以在这种需要输入多组单个字符的情况下,就不能使用scanf函数,回车会被读入,那么就要使用getchar函数来读入单个字符。

getchar函数:没有参数,作用是从计算机终端(一般是键盘)输入一个字符后接收它,想输入多个字符那就要用多个getchar函数。

 输入格式:char t;   t=getchar();

                 int t = 0; t=getchar();

EOF理解

EOF的意义及用法(while(scanf("%d",&n) != EOF))_一个奔跑的C的博客-优快云博客

//这个是输入整型变量时
#include <stdio.h>
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)==2){//如果a、b均赋值成功返回值为2,只是a赋值成功返回1
//  while(scanf("%d %d",&a,&b)!=EOF){
//  while(scanf("%d %d",&a,&b)!=-1){
//  while(~scanf("%d %d",&a,&b)){    
        printf("%d",a+b);
    }
    
    return 0;
}

!=EOF才是最保险的

正确方法↓

这个用getchar()吸收掉回车非常重要!!!!

 如果是输入两个字符的话 ↓

  while ((ch1 = getchar()) != EOF && (ch2 = getchar()) != EOF)

处理一个回车(空格)的情况↓↓

 

 

字符串

比如一个英文句子的大小写转化

10)数字字符组转化成数字输出

比如输入1和2,按字符数组输出就是12,而要按数字输出就是1*10+2

所以👇


#include <stdio.h>
#include <string.h>
int main()
{
    char s[85];
    //char a[85]={0};
    gets(s);
    int n=strlen(s);
    int num=0;
    for(int i=0;i<n;i++){
        if(s[i]>='0'&&s[i]<='9'){
         //  a[i]=s[i];
           num=num*10+s[i]-'0';
        }
    }
    printf("%d",num);
    return 0;
}
11)判断正整数的位数

方法1:利用数学函数

方法2:利用循环

正确版:

12.单目操作符(只有一个操作数):  ! (逻辑反操作)

13.条件操作符
 

 

if(x>y)

{n=x;}

else

{n=y;}

👉 用这个更简单 n = x > y ? x : y;

if(i%3==0){

printf("\n");

else{

printf(" ");

👉 这样写 printf((i+1)%3?" ":"\n");
14.sizeof

!注意sizeof和strlen计算数组大小的区别:sizeof还会多计算一个' \0'

!计算数组的元素个数:sizeof(arr)/sizeof(arr[0])



C语言----C语言中sizeof的用法_redrose2100的博客-优快云博客

15)将浮点数转四舍五入为整数类型
int main()
{
	float a;
	scanf("%f", &a);
	printf("%d", (int)(a + 0.5));
	return 0;
}

注意这里不能写成(int)a+0.5 那么就是把a转化成了整数类型但是加上0.5又变成浮点数类型了,前面用的是%d!!

*强制类型转化*

注意要转换的类型的括号位置

如果是计算百分比:

16.仔细仔细仔细再仔细,错了的时候看清楚是不是输出有空格或者标点符号,再看一遍题目和样例

17.a++和++a

*18.进制转化

**十进制、十六进制、八进制只是一种数据的表示形式,不是数据的存储形式。

**不同进制的数据存放都整形变量中都是整形值。(int)类型

十六进制转十进制)
#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%x", &a);

	printf("%d", a);
	return 0;
}
十进制转二进制)

#include <stdio.h>
void decToBin(int n);
int main()
{
	int x;
	while(scanf("%d",&x)!=EOF){
		decToBin(x);
		printf("\n");
	}
	return 0;
}
void decToBin(int n)
{
	 if(n<0){
	 	printf("-");
	 	n=-n;
	 }
	 if(n<2){
	 	printf("%d",n%2);
	 	return;
	 }
	 decToBin(n/2);
	 printf("%d",n%2);
}
十进制转为R进制)

#include <stdio.h>
void decToR(int,int);
int main()
{
	int x,r;
	while(scanf("%d%d",&x,&r)!=EOF){
		int i,n;
		decToR(x,r);
		printf("\n");
	}
	return 0;
}
void decToR(int n,int r)
{
	char s[35]="",a[]="0123456789ABCDEF";//余数 15种情况
	if(n==0){
		printf("0");
		return;
	}
	if(n<0){
		printf("-");
		n=-n;
		
	}
	int m=0;
	while(n>0){
		s[m++]=a[n%r];//如果不这样写就要用if else 写0-9的和大于10的两种情况
		n/=r;
	}
	for(int i=0;i<m/2;i++){
		char t=s[i];
		s[i]=s[m-i-1];
		s[m-i-1]=t;
	}
	printf("%s",s);
	
} 
19.无符号整型

实际应用中,有的数据的范围常常只有正值,如(学号、年龄),为了充分利用变量的值的范围,可以将变量定义为“无符号”类型。

*只能存放不带符号的整数,不能存放负数。

*无符号整型变量中可以存放的正数范围比一般整型变量中的正数范围扩大一倍。

*只有整型(包括字符型)可以加signed 或者unsigned ,实型数据(浮点数)不能加

*输出格式“%u”

如:unsigned short price =50;printf(“%u”,price);

20.关键字typedef(类型重命名)

第一个Matrix是结构体类型,第二个Matrix是结构体变量。

void Print(Matrix A);

函数类型就是Matrix 类型。

调用时直接 Print(xxx)即可。

21.switch语句处理多分支结构

 

 

22.break和continue

break结束整个循环过程;continue只结束本次循环(在此次循环内,continue后的语句将不再执行,直接进行下一次循环)。

 

进入死循环(无法跳出)

 23.关于getchar

在大多数情况下,int c = getchar();char c = getchar(); 是等价的。两者都使用 getchar() 函数从标准输入读取一个字符,并将其赋值给变量 c

然而,它们的本质上是不同的:

  • int c = getchar();:将 getchar() 返回的字符存储在一个整数类型的变量 c 中。这是因为 getchar() 返回的类型是 int,可以用来表示特殊值 EOF(文件结尾)以及合法的字符值。
  • char c = getchar();:将 getchar() 返回的字符存储在一个字符类型的变量 c 中。由于字符类型是一个整数类型,所以这种赋值是合法的。

一般情况下,我们可以使用 char 类型来存储单个字符,因为字符类型足以表示ASCII范围内的字符。当我们只关心字符输入时,使用 char 类型更直观且更常见。如果使用 int 类型,则需要注意将其转换为字符类型进行处理。

需要注意的是,getchar() 函数返回的是字符的ASCII码值(0到255之间)或特殊值 EOF,具体取决于输入流的状态。使用 char 类型时,可能会导致某些输入中的字符在转换为 EOF 时丢失信息,因为 char 类型不能存储 EOF。因此,在处理输入流时,使用 int 类型可以更全面地表示字符值和 EOF 值。

24.如何判断输入的数字中是否有2个数字相同

如1223 2214

25.求最大公约数和最小公倍数
26.学号输入(以000)开头时

27.注意宏观常量的定义

28.case里有多条语句要加上大括号,break不要忘记了
29.文件的读写

【一听就懂】文件的相对路径和绝对路径!C语言文件读写的常见问题,看过这个视频的都已经不会犯错啦!_哔哩哔哩_bilibili

freopen 用绝对路径 

绝对路径中不要含中文

选中文件  ---右键复制文件地址

记得修改斜杠 

30.三个数比较大小

#include <iostream>
using namespace std;
int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	if (a > b)
	{
		int t = a;
		a = b;
		b = t;
	}
	if (a > c)
	{
		int k = a;
		a = c;
		c = k;
	}
	if (b > c)
	{
		int g = b;
		b = c;
		c = g;
	}
	cout << a << "->" << b << "->" << c;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值