C语言-字符串

文章详细介绍了字符常量,包括ASCII字符表中的控制字符和转义字符,如 、 。接着讨论了字符串常量的概念,指出“xxx”表示字符串的首字符地址,并展示了如何计算字符串长度。文章还对比了字符数组和字符串常量的区别,强调了常量区的不可修改性,并探讨了const关键字在指针变量中的应用。
摘要由CSDN通过智能技术生成

字符串

1.字符常量

‘a’ ‘b’ ‘c’ ‘5’

1.1 ASCII

ASCII 字符表上的数字 0~31 以及 127(共 33 个)分配给了控制字符,用于控制像打印机等一些外围设备:

二进制十进制十六进制缩写含义
0000 0000000NUL空字符
0000 0001101SOH标题开始
0000 0010202STX文本开始
0000 0011303ETX文本结束
0000 0100404EOT传输结束
0000 0101505ENQ请求
0000 0110606ACK确认响应
0000 0111707BEL响铃
0000 1000808BS退格
0000 1001909HT水平制表符
0000 1010100ALF换行符
0000 1011110BVT垂直制表符
0000 1100120CFF换页符
0000 1101130DCR回车键
0000 1110140ESO取消变换(Shift out)
0000 1111150FSI启动变换(Shift in)
0001 00001610DLE数据链路转义
0001 00011711DC1设备控制一(XON 激活软件速度控制)
0001 00101812DC2设备控制二
0001 00111913DC3设备控制三(XOFF 停用软件速度控制)
0001 01002014DC4设备控制四
0001 01012115NAK拒绝接收
0001 01102216SYN同步空闲
0001 01112317ETB区块传输结束
0001 10002418CAN取消
0001 10012519EM连接介质中断
0001 1010261ASUB替换
0001 1011271BESC退出键
0001 1100281CFS文件分区符
0001 1101291DGS组群分隔符
0001 1110301ERS记录分隔符
0001 1111311FUS单元分隔符
0111 11111277FDEL删除

字符表上的数字 32~126 分配给了能在键盘上找到的字符:

在这里插入图片描述

1.2 转义字符

printf("a = %%d", 3);// a = %d​​

#include <stdio.h>

int main(){
    char c = '\n';
    printf("%c", c);
    c = '\'';
    printf("%c", c);
    c = '\t';
    printf("%c", c);
    c = '\\';
    printf("%c", c);
    c = '\a';
    printf("%c", c);
    return 0;
}
1.3 0 ‘0’ '\0’的区别

‘0’ == 48

‘\0’ == 0 空字符

2. 字符串常量

"abcdef" "123456"

2.1 “xxx” 表示的是字符串首字符的地址
2.2 为什么char*存储字符串
#include <stdio.h>

int main() {
    char *p = "abcdef"; // 地址存放到指针变量中
    p++;
    printf("%c", *p); // b
    return 0;
}
2.3 计算字符串的长度
#include <stdio.h>
#include <string.h>

int main() {
    char *p = "\\\a\0\n\012a0";
    printf("%d ", sizeof(p));                // 4
    printf("%d ", sizeof("\\\a\0\n\012a0")); // 8
    int n = strlen(p);
    printf("%d ", n); // 2
    p++;
    p++;
    p++;
    n = strlen(p);
    printf("%d ", n); // 4
    return 0;
}

3.字符数组和字符串常量的区别


3.1 常量区

不可用修改

  • 整形常量 ​ 10 123 -1234 0
  • 浮点常量 1.234 1.111
  • 字符常量 ​ ‘a’ ‘8’
  • 字符串常量 "abcdef"
  • 地址常量 &a 数组名 函数名
3.2 字符数组和字符串常量
#include <stdio.h>
#include <string.h>

int main() {
    char buf[10] = "abcdef";
    char *p = "abcdef";
    (*buf)++;
    (*p)++; // 字符常量不可修改
    return 0;
}

const

#include <stdio.h>
#include <string.h>

int main() {
    char a = 'a';
    char b = 'b';
    const char *pa = &a; //*pa不可修改
    pa = &b;
    *pa = 'c';
    char const *pb = &a; //*pb不可修改
    pb = &a;
    *pb = 'c';
    char *const pc = &a; // pc不可修改
    pc = &b;
    *pc = 'c';
    const char *const pd = &a; //都不可修改
    pd = &b;
    *pd = 'c';
    return 0;
}
  • const如果在*左, 那么指针变量可以修改,*指针变量不可以修改
  • const如果在*右, 那么指针变量不可以修改,*指针变量可以修改

strlen源码

size_t strlen(const char *str) {
    const char *eos = str;
    while(*eos++);
    return (end - str - 1);
}

size_t 表示的是 unsigned int

空指针

指针变量的值为NULL(0), 禁止访问空指针

NULL可以为任意指针赋值

#include <stdio.h>
#include <string.h>
#include <assert.h>

unsigned int m_strlen(char const *str) {
    // if (str == NULL){
    // return 0;
    //}
    assert(str); // 断言
    unsigned int n = 0;
    while (*str != '\0') {
        str++;
        n++;
    }
    return n;
}

int main() {
    char p[100] = "";
    scanf("%s", p);
    int n = m_strlen(p);
    printf("%d", n);
    return 0;
}

Debug 和 Release模式区别

  1. Release 对程序优化了,执行效率更高

  2. Debug针对程序员使用, 可以方便调试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值