(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; }
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; }
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; }
(要求没说要赋给第三个数组,输出就行,直接输出的版本:)
#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; }