一、常用库函数

1.sprintf

将格式化字符串内容放入指定地址空间

  • 常用于程序中获得printf打印的内容
  • 字符串拼接

2.sscanf

从指定空间中接收格式化字符串

  • 字符串格式非常固定,符合scanf常用的格式

3.strtok

字符串分割函数,能够根据指定的字符集对字符串进行分割


//将pstr指向的字符串遇到' '分割
strtok(pstr, " ");


//将上次分割剩余的内容再按照' '分割
strtok(NULL, " ");


//将上次分割剩余的内容遇到' ', ',', '?'分割
strtok(NULL, " ,?:");

4.strstr

在字符串中查找子串出现的位置


//在pstr指向的字符串中查找" "字符串,如果没有返回NULL
strstr(pstr, " ");

//从终端接收任意一个字符串,统计任意一个字符或字符串个数

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

int main(void)
{
    char str[32] = {0};
    char dst[32] = {0};
    char *pstr = NULL;
    char *ptmp[10] = {NULL}; 
    int curlen = 0;
    int i = 0;    

    gets(str);
    gets(dst);
    i = strlen(dst);
    
    pstr = str;
    while(1)
    {
        ptmp[curlen] = pstr;
        curlen++;           
        //避免指针被覆盖

        pstr = strstr(pstr,dst)
        //找到所有dst的地址

        if(NULL == *pstr)
        {
            break;
        }
        else if(*pstr = *dst)
        {
            *pstr == '\0';
        }

        pstr = pstr + i;
        //跳过dst,继续寻找
        
    }
        printf("dst_NUM:%d\n",curlen - 1);
                
    return 0;
}

二、内存常见的调试方法

1.C语言程序错误

1)语法错误

  • error:语法错误,无法生成对应二进制文件
  • Warning:语法警告,不影响二进制文件的生成,程
    序运行可能会出错

2)逻辑错误

运行结果和预期不符

  • 打印法

        在可能出错的位置加入打印,查看对应的结果是否与预期一致,如果一致在后续的代码

中继续加入打印,直到不满预期为止,则完成对错误的定位

  • GBD调试

        根据问题单步调试,直到找到错误为止

        1.编译时加入-g选项,允许gdb调试
        gcc filename.c -g


        2.调试生成的二进制程序
        gdb ./a.out


        3.设置断点
        b 行号/函数名


        4.运行代码
        r


        5.输入命令调试
        n 分步执行
        c 执行到下一处断点为止
        s 进入函数内调试
        p 打印
        q 退出

2.内存问题调试

1)内存越界(内存溢出)

现象:代码会出现偶现性、必现性的BUG,程序代码不稳定,数据被莫名其妙的修改
问题原因:指针的越界访问,特别是字符串越界访问

  • strcpy、strcat、strcmp、sprintf 这些都是有越界风险的函数
    推荐使用strncpy、strncat、strncmp、snprintf 替换之前有越界风险的函数

strcncpy(dst, src, sizeof(dst)-1);
替换
strcpy(dst, src);

2)段错误调试

现象:程序运行后报错 Segmentation fault (core dumped)
问题原因:错误使用指针,访问非法空间

解决方法:

  • 打印法,加入打印,前一句能打印,后一句无法打印,证明中间代码出现问题
  • gdb调试段错误

1. 编译时代码加入 -g 选项
2. 程序代码段错误时会产生core文件
3. 修改core配置文件(改一次),并使用命令允许生成core文件

ulimit -c unlimited
4. 使用gdb调试段错误

gdb a.out core

3.内存泄露

现象:长时间运行代码,剩余内存空间越来越少
问题原因:内存泄露,申请的空间没有被释放,所以不断有空间被申请,造成可用空间越来越

解决方法:valgrind

valgrind --tool=memcheck --check-leak=full ./a.out

4.安装valgrind工具

1) 让虚拟机能够上网:

1.打开"虚拟机" -> "设置" -> "网络适配器" -> 选择"NAT模式" -> 点击"确
定"


2.设置Ubuntu的IP地址为自动获取IP地址:
 1)打开网卡配置文件
  sudo vim /etc/network/interfaces
修改文件内容为:
auto lo
iface lo inet loopback
auto ens33
iface ens33 inet dhcp


2)重启虚拟机
sudo shutdown -r now
ping 8.8.8.8


3)配置apt-get工具集
1>点击"Ubuntu Software Center"
2>右键图标选择"Software & Updates"
3>源选择 aliyun
4>点击choose
5>输入密码1
6>点close(不能点revert)
7>终端输入:
sudo apt-get autoclean //清除旧源
sudo apt-get update //更新新源
sudo apt-get install -f //重建软件源依赖关系

3.安装valgrind
sudo apt-get install valgrind
valgrind --help

//显示版本后,已经安装好

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐