学C的第二十天【实用调试技巧:上期补充;5. 如何写出好(易于调试)的代码; 6. 编程常见的错误;练习:1. 类型转换 和 Unsigned int;2. 输入两个升序排列将两个序列合并为有序数列】-2

简介: (3). 示范二:模拟实现库函数:strlen

(3). 示范二:模拟实现库函数:strlen

                         

//模拟写出 strlen 函数
#include <stdio.h>
#include <assert.h>
//原 strlen 的返回值是 size_t
//size_t 是专门为 sizeof 设计的一个类型
//size_t 本质是 unsigned int / unsigned long (无符号整型 / 无符号长整型)
//unsigned:保证没有负数,长度最小是0,不可能为负数
size_t my_strlen(const char* str)
//使用 const 限制 *str,防止内容被修改
{
  //使用断言:指针不能为空
  assert(str != NULL);
  //计数器
  size_t count = 0;
  //开始计数
  while (*str) //内容不为 \0 则继续数
  {
    count++;//能进循环说明此时数组有值
    str++;//指针移向下一位
  }
  return count;
}
int main()
{
  char arr[] = "abc";
  int len = my_strlen(arr);
  printf("%zd\n", len);
  //%zd :专门用来打印 size_t 类型的值
  //%u :打印无符号整数
  return 0;
}

fd223b7f2eaa43bc86ec7c7c8cabc6c6.png

6. 编程常见的错误

                 

(1). 编译型错误(语法错误)

             

直接看错误提示信息双击),解决问题。或者凭借经验就可以搞定,相对来说简单。

(2). 链接型错误(LINK:链接期间发现的错误)

             

错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误

(3). 运行时错误(能够运行,但结果不是想要的)

             

借助调试逐步定位问题。最难解决。                

练习:

             

(补充知识点:全局变量静态变量,是放在静态区的,如果不初始化默认0

             

1. 类型转换 和 Unsigned int 对于负数的影响

#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0;
}


90eb928289244172bb415ad9f40d9938.png

2. 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

                             

( 循环的使用判断条件 设置得很巧妙,赋给第三个数组的版本:)

#include <stdio.h>
int main() {
    int n = 0;
    int m = 0;
//牛客网是支持变长数组的
    scanf("%d %d", &n, &m);
    //变长数组
    int arr1[n];
    int arr2[m];
    //数组赋值
    //接受输入的第一行数据
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    //接受输入的第二行数据
    i = 0;
    for(i=0; i<m; i++)
    {
        scanf("%d", &arr2[i]);
    }
    //进行合并:
    int arr3[n+m];//变长数组不能初始化
    i = 0; //arr1下标
    int j = 0; //arr2下标
    int k = 0; //arr3下标
    while(i<n && j<m)
    //i<n:arr1下标小于arr1长度,arr1还有值
    //j<m:arr2下标小于arr2长度,arr2还有值
    //两个数组都有值再进行比较赋值
    {
        if(arr1[i] < arr2[j])//arr1的值小于arr2的值
        {
            arr3[k] = arr1[i];//把大的值赋给arr3
            //给值 和 被给值 的数组下标都往后移
            k++;
            i++;
        }
        else //等于时放谁都可以 + arr2比较小
        {
            arr3[k] = arr2[j];//把大的值赋给arr3
            //给值 和 被给值 的数组下标都往后移
            k++;
            j++;
        }
    }
    // 此时 i ,j ,k 下标都已经移到了合适的位置
    //跳出数组说明有一个数组已经遍历完了
    //判断是哪个数组遍历完了
    if(i == n)//arr1下标等于数组长度
    {
        //arr1遍历完了,需要将arr2中剩余的元素全部放在arr3中
        while(j<m)//arr2下标还小于arr2数组长度就继续
        {
            arr3[k] = arr2[j];
            k++;
            j++;
        }
    }
    else
    {
        //arr2遍历完了,需要将arr1中剩余的元素全部放在arr3中
        while(i<n)//arr2下标还小于arr2数组长度就继续
        {
            arr3[k] = arr1[i];
            k++;
            i++;
        }
    }
    //输出
    for(i=0; i<n+m; i++)
    {
        printf("%d", arr3[i]);
    }
    return 0;
}

ab5c0a4e0fb64221aa9724f649e53f65.png

(要求没说要赋给第三个数组,输出就行,直接输出版本:)

#include <stdio.h>
int main() {
    int n = 0;
    int m = 0;
//牛客网是支持变长数组的
    scanf("%d %d", &n, &m);
    //变长数组
    int arr1[n];
    int arr2[m];
    //数组赋值
    //接受输入的第一行数据
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    //接受输入的第二行数据
    i = 0;
    for(i=0; i<m; i++)
    {
        scanf("%d", &arr2[i]);
    }
    i = 0; //arr1下标
    int j = 0; //arr2下标
    while(i<n && j<m)
    //i<n:arr1下标小于arr1长度,arr1还有值
    //j<m:arr2下标小于arr2长度,arr2还有值
    //两个数组都有值再进行比较赋值
    {
        if(arr1[i] < arr2[j])//arr1的值小于arr2的值
        {
            printf("%d ", arr1[i++]);//哪个小打印哪个
        }
        else //等于时放谁都可以 + arr2比较小
        {
            printf("%d ", arr2[j++]);//哪个小打印哪个
        }
    }
    // 此时 i ,j 下标都已经移到了合适的位置
    //跳出数组说明有一个数组已经遍历完了
    //判断是哪个数组遍历完了
    if(i == n)//arr1下标等于数组长度
    {
        //arr1遍历完了
        while(j<m)//arr2下标还小于arr2数组长度就继续
        {
            printf("%d ", arr2[j++]);
        }
    }
    else
    {
        //arr2遍历完了
        while(i<n)//arr2下标还小于arr2数组长度就继续
        {
            printf("%d ", arr1[i++]);
        }
    }
    return 0;
}

100f4f65618b4146ad88cce6a59ed176.png

相关文章
|
1月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
43 3
|
6月前
|
SQL 关系型数据库 MySQL
unsigned int 虽然mysql支持,但是不建议使用,因为可能在未来某个版本删除
unsigned int 虽然mysql支持,但是不建议使用,因为可能在未来某个版本删除
46 2
|
6月前
|
编译器 C++
C++_int负数转unsigned
C++_int负数转unsigned
62 0
|
6月前
|
Python
modelscope通义千问的14b量化版出错 说没有版本 这个代码都是从页面上粘贴下来的 Int8 Int4都试过了一样的错误?
modelscope通义千问的14b量化版出错 说没有版本 这个代码都是从页面上粘贴下来的 Int8 Int4都试过了一样的错误?modelscope.hub.errors.NoValidRevisionError: The model: qwen/Qwen-14B-Chat-Int4 has no valid revision!
546 1
|
6月前
|
存储 人工智能 编译器
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
|
6月前
|
存储 编译器 程序员
learn_C_deep_4 (类型和变量命名、sizeof(int) *p表示什么意思、原码、反码和补码的概念、计算机中数据计算时,为什么要转为二级制、unsigned和signed关键字)
learn_C_deep_4 (类型和变量命名、sizeof(int) *p表示什么意思、原码、反码和补码的概念、计算机中数据计算时,为什么要转为二级制、unsigned和signed关键字)
|
6月前
|
存储 C语言
学习总结(位操作符;循环输入的三种方式;交换两个变量值的三种方法;打印数字对应的二进制;unsigned int 与int 的区别;改变特定位数0/1;&&和||的连续操作(与前置,后置结合))
学习总结(位操作符;循环输入的三种方式;交换两个变量值的三种方法;打印数字对应的二进制;unsigned int 与int 的区别;改变特定位数0/1;&&和||的连续操作(与前置,后置结合))
68 0
|
存储 小程序 程序员
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
8k字详解整型(int)/字符型(char)/浮点型(float)/有符号(signed)/无符号(unsigned)数据在内存中的存储【程序员内功修炼/C语言】
147 0
|
6月前
|
数据采集 分布式计算 数据处理
Dataphin常见问题之与指定类型int不兼容如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
6月前
|
SQL 流计算 OceanBase
OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
【2月更文挑战第25天】OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
175 3