从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语言的精彩世界,为今后的学习和开发之路提供一些启发。

文章结束啦~

相关推荐
vortex511 分钟前
解决 VSCode 中 C/C++ 编码乱码问题的两种方法
c语言·c++·vscode
醉颜凉2 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
hunandede2 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
c++·ffmpeg·音视频
爱学习的大牛1232 小时前
通过vmware虚拟机安装和调试编译好的 ReactOS
c++·windows内核
tumu_C4 小时前
C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
c++·开源
杜若南星4 小时前
保研考研机试攻略(满分篇):第二章——满分之路上(1)
数据结构·c++·经验分享·笔记·考研·算法·贪心算法
Neophyte06084 小时前
C++算法练习-day40——617.合并二叉树
开发语言·c++·算法
云空4 小时前
《InsCode AI IDE:编程新时代的引领者》
java·javascript·c++·ide·人工智能·python·php
写bug的小屁孩4 小时前
websocket初始化
服务器·开发语言·网络·c++·websocket·网络协议·qt creator
湖南罗泽南5 小时前
Windows C++ TCP/IP 两台电脑上互相传输字符串数据
c++·windows·tcp/ip