大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。
返回顶部

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指向变量的值不可修改
作用 : 防止通过指针变量 修改 指向变量的内容
 *           仅用于读指向的内容
 
    int const * pb = &b; //pb指向变量的值不可修改,跟上面代码同
    const int * const pb = &b;指向不可修改,指向的变量不可修改
 
/*
 * 数组名 和指针的区别
 *     1. 数组名 是常指针,不可修改
 *     2. sizeof 计算数组名 为数组的所有字节数
 *        sizeof 计算指针变量 为机器字宽度
 *     3. 指针可以作为 函数的返回值类型,数组不行
 */

-------------
字符串

字符 char c;

  c 没有字符串类型   c++  string

在c语言中 由一串字符+\0 一个字符串
\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!
//初始化 系统会加 \0

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
scanf("%s",a); // 输入字符串 遇到有 空格 或者 回车会结束
解决:
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 复制第二个参数内容指定的个数

strcpy(a,pa); //将pa指向的字符串 赋值到a数组
#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
/*
 * 字符串比较运算   > < =
 *  strcmp
 *  [练习]
 *     1.在主函数中声明一个 passwd 字符数组,用来存储用户的密码.
 *     char passwd[12] = {0};
 *
 *     2.编写一个void setPasswd(char *passwd);
 *     传入的参数 是主函数中保存密码的字符数组passwd
 *     功能  设置用户密码
 *
 *     3.编写一个int login(const char *passwd)
 *           传入的参数 char *passwd  是主函数保存密码的数组
 *           功能   三次输入机会  输入正确返回1
 *                   错误返回 0
 *     4.主函数 先调用设置密码的函数
 *              再调用登录login函数
 */
#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; 
}
//char *input; //指针变量  指向不确定,有可能执行 当前进程其他内存位置,导致系统不安全
 //char *input=NULL; //指针变量 赋值为NULL  指向0地址 0地址不可用,通过段错误可以结束程序
 //input 一定要指向一块有效的内存 -->局部变量 全局变量  
#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
/*
 * strcat 将第二个参数的字符串 连接到第一个指针指向的内存中
 */
#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++;

}

 

 

posted on 2020-05-17 22:28  何所为  阅读(222)  评论(0编辑  收藏  举报

导航