C语言笔记02
getchar() putchar() 只对单个字符进行输入输出
多分支语句:
可以对多种特殊情况进行处理;
if写法:
if(判断条件)
{
代码块;
}
else if(判断条件)
{
代码块2;
}
...
else
{
代码块;
}
//特别注意else会与最近的if进行搭配
switch:
switch(整形变量)
{
case 整形常量:代码块;break;
case...
default:代码块;break;
}
根据整形变量的值去找对应的case去执行
注意:case后常量不能一样,不加break从找到的case开始向后一直执行;
应用场景:
if多分支应用场景:判断条件为一个范围
switch:判断条件更加精确的时候
部分习题
#include<stdio.h>
int main()
{int a,b=0,i=1;scanf("%d",&a);while(a){b+=(a%2)*i;a/=2;i*=10;}printf("%d\n,b);return 0;
}
计算X年X月X日是哪一天
#include <stdio.h>
int main(int argc, char *argv[])
{
int year,mouth,day;
int count = 0;
scanf("%d.%d.%d",&year,&mouth,&day);
switch(mouth){
case 12:
count+=day;
day = 30;
case 11:
count+=day;
day = 31;
case 10:
count+=day;
day = 30;
case 9:
count+=day;
day = 31;
case 8:
count+=day;
day = 31;
case 7:
count+=day;
day = 30;
case 6:
count+=day;
day = 31;
case 5:
count+=day;
day = 30;
case 4:
count+=day;
day = 31;
case 3:
count+=day;
if((year%4==0&&year%100!=0)||year%400==0)
{
day = 29;
}else{
day = 28;
}
case 2:
count+=day;
day = 31;
case 1:
count+=day;;
}
printf("今天是今年的第%d天\n",count);
return 0;
}
99乘法表
#include <stdio.h>int main(int argc, char *argv[])
{ for(int i=1;i<=9;i++){for(int j =1;j<=i;j++){printf("%dX%d=%d\t",i,j,i*j);}printf("\n");}return 0;
}
void value not ignored as it ought to be
这是GCC的错误信息,意思是 一个函数Function的return的类型是void ,但你却尝试把这个函数返回的值赋给非void类型的变量。
注意
memset 一般只能用来给特定的字符数组赋值 或者是数组清零
它接受三个参数:一个指向内存区域的指针、要设置的特定值和要设置的字节数。该函数可以将指定内存区域设置为特定值,常用于对新分配的内存进行初始化,以确保数据的一致性和安全性。
memset(目标内存指针,要设置的值,要设置的字节数)
memset函数的主要功能是将一段内存区域设置为指定值 [4]。具体来说,memset函数通过接收三个参数:目标内存指针str、要设置的值c和要设置的字节数n,可以完成以下任务:
- 设置内存区域的值:函数将str指针指向的内存区域的前n个字节都设置为指定值c。在实际操作中,c的值会被转换为unsigned char类型,并且只有其低8位会被使用。
- 初始化内存:由于memset能够迅速地将内存区域设置为特定值,因此它常常被用于初始化新分配的内存块。例如,可以将内存块清零或设置为某个特定值。
- 清空内存区域:通过将c设置为0,memset可以用来清空一段内存区域即将所有字节设置为0。这在释放内存之前清理数据结构或避免内存泄漏时特别有用。
- 快速设置内存区域的值:当需要快速将内存区域设置为某个特定值时,memset提供了一种高效的方法。相比于使用循环逐个设置字节,memset通常能够更快地完成任务。
总之,memset函数是一个高效的内存操作工具,它能够快速地将内存中的连续字节初始化或设置为特定的值 [5]。它特别适用于将内存区域清零或设置为非零默认值,这在内存分配后初始化和内存释放前清理数据时非常有用。此外,由于其通常由编译器优化,memset在执行速度上通常优于手动循环设置字节的操作。
Linux低地址存高位
在Linux系统中,数据的存储方式可以是大端序(Big-Endian)或小端序(Little-Endian),这取决于系统的架构。
基本概念
大端序(Big-Endian):数据的低位字节保存在内存的低地址端,而数据的高位字节保存在内存的高地址端。这种存储方式类似于我们平时书写数字的习惯,先写高位再写低位。
小端序(Little-Endian):数据的低位字节保存在内存的高地址端,而数据的高位字节保存在内存的低地址端。这种存储方式与我们的书写习惯相反。
Linux系统中的情况
Linux系统本身并不规定必须是大端序或小端序,而是根据其运行的硬件平台来决定。常见的Linux系统架构如x86(Intel/AMD)是小端序,而一些ARM架构的Linux系统可以是大端序或小端序,具体取决于配置。
记录个蛮有趣的错误 下面就是
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{ char* str=(char*)malloc(sizeof(char)*10);printf("%p\n",str);str="hello";//str errorprintf("%p\n",str);printf("%s\n",str);printf("%p\n",str);free(str);str = NULL;printf("111111\n");return 0;
}
问题出在str=“hello”; 这条语句上 因为str是自己申请分配空间 但是却定向指定了一个常量区
出现了地址变更 当free函数执行时候就会出现段错误 正确做法是使用strcpy函数对str赋值
修改后
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{ char* str=(char*)malloc(sizeof(char)*10);printf("%p\n",str);//str="hello";//str errorstrcpy(str,"hello");printf("%p\n",str);printf("%s\n",str);printf("%p\n",str);free(str);str = NULL;printf("111111\n");return 0;
}