010_stdc_C语言
回顾:
变量的作用域和生命周期
局部变量
全局变量
静态变量(局部的特性,全局的生命周期)
静态局部变量
静态全局变量
指针,
指针变量
通过指针变量 间接访问 它指向的变量
int * pa
指针运算
pa+1;
pa-1;
pa>pb
pa++;
pb--;
指针变量和数组
数组名可以通过+地址偏移的方式 取数组元素
也可以对指针变量通过下标[n] 取地址偏移的值
--------------------------
const constant --> 永恒的 ,只读的
1.const 修饰普通变量
const int i = 0; //声明变量i 并且i只读
指针变量 和数组的区别
指针变量与数组第一个区别: 数组名 是一个常指针
int * const pb = &b; //pb 永远指向b, pb 声明为只读
int b=3;
int * const pb = &b;//pb 永远指向b, pb 声明为只读
const int * pb = &b; //pb指向变量的值不可修改
//不能通过pb 间接修改 b的值
const int * pb = &b; //pb指向变量的值不可修改
-------------
字符串
字符 char c;
c 没有字符串类型 c++ string
在c语言中 由一串字符+\0 一个字符串
\0 == 0
字符串在程序中的表示形式
字符串常量 字符串字面值
"hello world!"
字符指针 char *pc;
char *str ="abcdef"; //将字符串常量的地址赋值给字符指针str //str 指向字符串起始位 printf("%c\n",*str);
//a
不可通过指针修改字符串如 //*str = 'A';
字符数组 char a[13];
字符数组存放比字符个数至少多一个
#include <stdio.h> int main(){ char *str ="abcdef"; char a[13]="hello world!"; printf("str = %s\n",str); printf("a = %s\n",a); getchar(); return 0; }
str = abcdef
a = hello world!
s%读到 \0 才结束读
#include <stdio.h> int main(){ char a[13]="hello world!"; //初始化 系统会加\0 char *str = a; scanf("%s",str); // printf("str = %s\n",str); return 0; } ssssss str = ssssss
gets(a); //不要超过数组长度
#include <stdio.h> int main(){ char a[13]="hello world!"; //初始化 系统会加\0 char *str = a; gets(a); //不要超过数组长度 printf("str = %s\n",str); getchar(); return 0; }
#include <stdio.h> int main(){ char *pa = "hello world!"; char *pb = NULL; printf("pa = %s\n",pa); getchar(); return 0; }
char a[20] = {"0"}; //20元素都是0
#include <stdio.h> int main(){ char a[20] = {"0"}; char *pa = "hello world!"; int i = 0; while(pa[i]) { a[i] = pa[i]; i++; } printf("pa = %s\n",a); getchar(); return 0; }
字符串的操作
字符串的操作
strcpy 复制第二个参数内容到 \0
strncpy 复制第二个参数内容指定的个数
#include <stdio.h> #include <string.h> int main(){ char a[20] = {"0"}; char *pa = "hello world!"; strcpy(a,pa); //将pa指向的字符串 赋值到a数组 printf("pa = %s\n",a); getchar(); return 0; }
#include <stdio.h> #include <string.h> int main(){ char a[20] = {"01234567899abcdef"}; char *pa = "hello world!"; strcpy(a,pa); //将pa指向的字符串 赋值到a数组 printf("pa = %s\n",a); printf("--------------\n"); for(int i = 0;i<20;i++) { printf("%c",a[i]); } printf("\n"); getchar(); return 0; }
第一次输出是因为把前一个字符串的 \0 也复制过去了,输出函数执行到 \0 结束,所以打印输出是
hello world!
第二次则输出全部的字符(修改过的和还未被修改到的)
hello world! cdef
strcmp 字符串比较
//pa == pb 返回 0
//pa > pb 返回 1
//pa < pb 返回 -1
#include <stdio.h> #include <string.h> int main(){ char *pa = "abcd"; char *pb = "ABCD"; int a = strcmp(pa,pb); //pa == pb 返回 0 //pa > pb 返回 1 //pa < pb 返回 -1 printf("a = %d\n",a); getchar(); return 0; } //a = 1
#include <stdio.h> #include <string.h> void setPsd(char *passwd){ printf("请设置密码:\n"); scanf("%s",passwd); } int lonin(const char *passwd){ char c[] = {0}; for (int i=2;i>=0;i--) { printf("请输入密码:\n"); scanf("%s",c); if (strcmp(c,passwd) == 0) { return 1; } printf("您还有%d次机会!\n",i); } return 0; } int main(){ char passwd[]=" "; setPsd(passwd); printf("密码是:%s\n",passwd); if (lonin(passwd)) { printf("登录成功!\n"); } getchar(); getchar(); return 0; }
#include <stdio.h> #include <string.h> void setPsd(char *passwd){ printf("请设置密码:\n"); scanf("%s",passwd); } int lonin(const char *passwd){ char a[]={0}; char *input = a; for (int i=2;i>=0;i--) { printf("请输入密码:\n"); scanf("%s",input); if (strcmp(input,passwd) == 0) { return 1; } printf("您还有%d次机会!\n",i); } return 0; } int main(){ char passwd[]=" "; setPsd(passwd); printf("密码是:%s\n",passwd); if (lonin(passwd)) { printf("登录成功!\n"); } getchar(); getchar(); return 0; }
管理系统
#include <stdio.h> #include <string.h> void setPsd(char *passwd){ printf("请设置密码:\n"); scanf("%s",passwd); } int lonin(const char *passwd){ char a[]={0}; char *input = a; for (int i=2;i>=0;i--) { printf("请输入密码:\n"); scanf("%s",input); if (strcmp(input,passwd) == 0) { return 1; } printf("您还有%d次机会!\n",i); } return 0; } int main(){ char passwd[]=" "; int flag = 1; while(flag){ printf("+------------------+\n"); printf("| 登录菜单 |\n"); printf("+------------------+\n"); printf("| |\n"); printf("| 1.设置密码 |\n"); printf("| 2.登录系统 |\n"); printf("| 0.退出系统 |\n"); printf("| |\n"); printf("+------------------+\n"); printf("选择您的操作:"); int cmd = 0; scanf("%d",&cmd); switch(cmd) { case 1: setPsd(passwd); break; case 2: if (lonin(passwd)) //1 { //登录成功的代码 printf("登录成功\n"); } else { printf("密码错误,登录失败\n"); } break; case 0: printf("退出系统\n"); flag = 0; break; default: printf("操作数错误\n"); break; } } getchar(); getchar(); return 0; }
strlen 计算字符串的长度 也就是字符个数
strcat 连接字符串
memset 内存清0
/*
* strlen 计算字符串长度
* 只打印字符的个数,不包括\0
*
* 谈一谈 strlen 和 sizeof 的区别
*/
#include<stdio.h> #include <string.h> int main(){ char * str = "hello world!"; printf("strlen(str) = %d\n",strlen(str)); getchar(); return 0; }
//12
#include<stdio.h> #include <string.h> int main(){ char pa[20]="hello"; char pb[] = "world"; strcat(pa,pb); printf("pa = [%s]\n",pa); getchar(); return 0; }
中间加空格
#include<stdio.h> #include <string.h> int main(){ char pa[20]="hello"; char pb[] = "world"; strcat(pa," "); strcat(pa,pb); printf("pa = [%s]\n",pa); getchar(); return 0; }
memset 内存清0
#include<stdio.h> #include <string.h> int main(){ char pa[50]="helsdsdsdsdsdsdsdlo"; char pb[] = "world"; strcat(pa," "); strcat(pa,pb); printf("pa = [%s]\n",pa); memset(pa,0,20); //对pa的20个元素设置为0 printf("pa = [%s]\n",pa); getchar(); return 0; }
[练习]
输入一个数字字符串 比如:"102" ==>102
"12a3" ==>12
将该字符串 转换为一个十进制数102
char *pc = "123"; int a = 0; while(*pc>='0'&& *pc<='9') { a =a*10; a += *pc - 0x30; pc++; }