从TypeScript到C语言:前端初窥C语言之门

C语言初探:从几个基本方法认识指针

作为一个前端,平时一一直使用TypeScript来写代码,今天来学习了解一下C语言。

  • TS和C语言两者都是静态类型语言,需要在编译阶段进行类型检查。

  • C语言需要通过编译器将源代码编译成机器码,然后才能执行。而TypeScript需要将代码编译成JavaScrip在运行时通过浏览器或Node.js解释执行。

下面通过实现几个字符串的方法来初窥C语言之门:

认识指针

C语言中使用指针来处理内存和数据传递,而TypeScript中使用引用来处理对象和数据传递

指针是一个变量,用于存储另一个变量的内存地址。通过指针,我们可以访问和操作存储在内存中的数据。

先看下面的的代码,运行会输出什么:

rust 复制代码
const char str[] = "HelloWorld";

printf("%p\n", &str);

& 在这里是取地址符号,这里会打印出str的首地址。

再看下面的代码,会输出什么:

arduino 复制代码
int main()
{
    const char str[] = "HelloWorld";

    printf("%d\n", *str);

    return 0;
}

这段代码会打印出数字 72,在C语言中,字符常量(比如 'H')实际上是使用ASCII码值来表示的。ASCII码是一个标准的字符编码系统,将字符映射到了数字值。在ASCII码中,字符 'H' 对应的值是 72。因此,代码中的 *str 实际上是获取了字符串 str 的第一个字符 'H' 的ASCII码值,然后通过 printf 函数输出这个值,即 72。

计算字符串长度strlen

原理:定义一个变量,在遇到终止符 '\0' 前循环递增变量,同时指针向后指向下一个字符。

arduino 复制代码
/**
 * 计算字符串长度
 */
size_t strlen(const char *str)
{
    if (str == NULL)
    {
        return 0;
    }

    int length;

    while (*str != '\0')
    {
        length++;
        str++; // 指针后移
    }

    return length;
}

调用

输出字符串长度10(不包括 '\0' )。

arduino 复制代码
 const char str[] = "HelloWorld";

 size_t len = strlen(str);
    
 printf("%zu\n", len);

字符串拼接strcat

原理:先保存原始指针,再循环移动 dest 指针到目标字符串的末尾,再将 src 字符串的内容复制到 dest 字符串的末尾,在遇到src字符串的终止符时停止并在末尾加上 '\0' 即可。

arduino 复制代码
/**
 * 字符串拼接
 */
char *strcat(char *dest, const char *src)
{
    if (dest == NULL || src == NULL)
    {
        return NULL;
    }

    char *origin = dest;

    while (*dest != '\0')
    {
        dest++; // 将指针指向末尾
    }

    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }

    *dest = '\0';

    return origin;
}

调用

信心满满的运行,结果居然什么都没有输出??额,咋回事呀?

arduino 复制代码
char *res = strcat("iknow", "uknow");

printf("%s\n", res);

检查了一下代码,发现写习惯TS了,直接就这样调用了 strcat("iknow", "uknow");,疏忽了字符串空间的申请,导致后面的字符拼接不上去, 见谅~

重新修改了一下,申请了一个足够的空间就可以正确拼接输出 'iknowuknow' 了:

arduino 复制代码
char dest[100] = "iknow";

char *res = strcat(dest, "uknow");

printf("%s\n", res);

字符串复制strcpy

原理:先保存dest原始指针,随后循环将src的字符不断赋值给 dest,指针向后不断移动,直到遇到src的终止符,最后加上 '\0'

有了刚才的经验,写这个函数已经轻车熟路了:

ini 复制代码
/**
 * 字符串复制
 */
char *strcpy(char *dest, const char *src)
{
    if (dest == NULL || src == NULL)
    {
        return NULL;
    }

    char *origin = dest;

    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }

    *dest = '\0';

    return origin;
}

调用

打印dest输出了 ursmilekillmyheart 说明复制成功了:

arduino 复制代码
char dest[100] = "iknow";

char *res = strcpy(dest, "ursmilekillmyheart");

printf("%s\n", dest);

字符串比较strcmp

原理:先对空指针进行处理,然后指针向后,返回字符间的差值,为0就说明字符串一致。

arduino 复制代码
/**
 * 字符串比较
 */
int strcmp(const char *s1, const char *s2)
{
    if (s1 == NULL || s2 == NULL)
    {
        if (s1 == s2)
        {
            return 0;
        }
        else if (s1 == NULL)
        {
            return -1;
        }
        else
        {
            return 1;
        }
    }

    while (*s1 != '\0' && *s2 != '\0')
    {
        if (*s1 != *s2)
        {
            return (*s1 - *s2);
        }
        s1++;
        s2++;
    }
    return (*s1 - *s2);
}

调用

调用后输出0:

ini 复制代码
const char *str1 = "Huawei";
const char *str2 = "Huawei";

int res = strcmp(str1, str2);

printf("%d", res);

TS和C语言有诸多相似之处,感谢Typescript,极大的方便了我的学习和开发,拓展了我的思维,加深了我对语言的认识。这几个函数自己手动实现很适合作为学习指针的练习,通过对指针的操作我们可以访问字符串的每一个字符并实现一些方法。

初步探索C语言的精彩世界,为今后的学习和开发之路提供一些启发。

文章结束啦~

相关推荐
6Hzlia6 分钟前
【Hot 100 刷题计划】 LeetCode 45. 跳跃游戏 II | C++ 贪心算法最优解题解
c++·leetcode·游戏
森G28 分钟前
48、柱状图---------QChart
c++·qt
Tanecious.34 分钟前
蓝桥杯备赛:Day8-小苯的异或和
c++·蓝桥杯
王老师青少年编程41 分钟前
csp信奥赛c++中的递归和递推研究
c++·算法·递归·递推·csp·信奥赛
样例过了就是过了1 小时前
LeetCode热题100 跳跃游戏
c++·算法·leetcode·贪心算法·动态规划
chen_ever1 小时前
从网络基础到吃透 Linux 高并发 I/O 核心(epoll+零拷贝 完整版)
linux·网络·c++·后端
无限进步_1 小时前
【C++&string】寻找字符串中第一个唯一字符:两种经典解法详解
开发语言·c++·git·算法·github·哈希算法·visual studio
小此方2 小时前
Re:思考·重建·记录 现代C++ C++11篇 (二) 右值引用与移动语义&引用折叠与完美转发
开发语言·c++·c++11·现代c++
深邃-2 小时前
【C语言】-数据在内存中的存储(1)
c语言·开发语言·数据结构·c++·算法
xiaoye-duck2 小时前
《算法题讲解指南:优选算法-字符串》--61.最长公共前缀,62.最长回文子串,63.二进制求和,64.字符串相乘
c++·算法·字符串