@TOC
C语言小白学习积累篇(一)
你好! 这是我在学习过程中遇到的问题,如果你也是零基础学习C语言,希望这篇文章能对你有所帮助.。大佬们看看笑一笑就好。
报错类型
C语言真的很严格,它不像python那样简单粗暴,有时候歪一点脑筋就会出错,在编译前祈祷:球球了,跑通吧。
初始化内存
//此函数为了拿到字符串的长度
int get_len(char* str) {
int len, count;// = 0; ---------->报错在这里
while (str[count])
{
count++;
}
len = count;
return len;
}
//报错--->使用了未初始化的局部变量 “count”
count变量没有初始化值就开始循环,应该先给count赋值0,给它一个内存空间,这个错误可能在很多大佬看来没什么,但是很多像我一样的新手都可能会犯迷糊。
②字符串&字符数组
// 传入 char str1[] = "***ADWADWQHD**";
void del(char str[]) {
char _temp[100];
int count = 0, i, a = 0;
int len;
len = get_len(str);
for (i = 0; i < len; i++) {
if (str[i] != '*') {
_temp[a++] = str[i];
}
}
_temp[a] = '\0'; // 0 跟 \0 --------->错误在这里
printf("%s", _temp);
}
这里没有报错,但是输出了大家都不想看到的东西:"烫烫烫烫…"这个东西出现有两个原因,一种是字符串没有初始化,如:
char str1_[10];
printf("%s", str1_);
// 输出
/*烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫邇窇气
*/
原因:
当使用了一个未初始化的局部变量时,它的初始值就是0xCCCCCCCC,而“烫”字对应的十六进制正好是0xCCCC,如果对它进行以字符串的形式输出就会输出“烫烫烫…”。[2]
第二种是字符串数组最后不是 “\0”, 解决方案:
在最后赋值’\0’ 或者 0
写成代码: _temp[a] = ‘\0’
③二分法
void search(int a) {
int list[] = { 1, 5, 9, 12 ,17, 27, 68, 90, 100, 105 };
int l = 0, r = 9, m;
while (l <= r) {
m = (l + r) / 2;
if (list[m] == a) {
printf("find %d\n", a);
break;
}
else if (list[m] < a) {
l = m + 1;
}
else if(list[m] > a){ r = m - 1; }
if (l > r) { printf("\n找不到%d!!\n", a); } //------> 请关注这句
}
}
这里是要写一个二分查找法排序,传入的参数为需要查找的数字a。我在第一次做的时候并没有考虑到找不到a的情况,所以是一个死循环。其实要做到这点很简单,只需要保证左边的索引 l 始终在 右边的索引 r 左边,这样就能保证二分查找的合理性。敲成代码就是l <= r注意是<=,写成 < 则可能会找不到。
④字符串的定义
刚拿到题,上来先写个char **,后面又改成char *[], 后来则是char[][],那么这几个都有什么区别??定义之后的操作又会怎么样??
一维数组:
首先看大小,使用sizeof(),返回变量所占系统内存的大小:^注意,sizeof(char)默认占用1字节
还记得第一个问题里的get_len()拿到字符串长度的函数吗,如果这个字符串是以数组形式定义的,只需要一个sizeof()就可以轻松解决。但如果是以指针形式定义的,它就会返回四个字节,即一个指针所占用的内存大小。
即:
int s1 = sizeof(char * str); //注意,这里只是类型,并不是实际传入参数
// s1输出 %d为 4,表示为字符指针自身4字节。
int s2 = sizeof(char str[]); //有几个字返回几个字,注意同上
除了存储的方式不同外,想一想也知道,指针类型定义的两个字符串str1 和 str2 ,假如指向的字符串是相同的,那么他俩的地址也一样。
即:
char * str1 = "12345";
char str2[5] = "12345";
总结下来:用指针类型定义的字符串的指针本身有一定的内存空间,指向字符串所在的空间。 数组形式定义的字符串本身就存储了字符,方式为一字节一个字符。在C语言中,双引号括起的代表字符串,而单引号括起才代表整型,所以当在你用if语句判断时,应该用单引号括起。
例:
if(str[i] == '*'){...}
二维数组
在本例中的二维数组定义字符串:
char countries[5][10] = {"USA", "China", "British", "GitHub", "England"};
其中10不能省略,但5可以省略,即:
char countries[][10] = {...};
总体代码
方便copy,直接在这里写上所有代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//拿到字符串的长度
int get_len(char* str) {
int len, count = 0;
while (str[count])
{
count++;
}
len = count;
return len;
}
/*
*参数 str 需要处理的字符串
*输入一个字符串,删除*:
*输入 adwfef**efrfrg******
*输出 adwfefefrfrg
*/
void del(char str[]) {
char _temp[100];
int count = 0, i, a = 0;
int len;
len = get_len(str);
for (i = 0; i < len; i++) {
if (str[i] != '*') {
_temp[a++] = str[i];
}
}
_temp[a] = '\0'; // 0 跟 \0
printf("%s", _temp);
}
/*
* 用qsort排序字符串,比较字符串数组中字符串的大小
*/
int compare(const void* c1, const void * c2) {
//char* country1 = *(char**)c1;
//char* country2 = *(char**)c2;
return strcmp((char*)c1,(char*)c2);
}
/*
*参数 a 输入查找的数字
*二分法查找
*/
void search(int a) {
int list[] = { 1, 5, 9, 12 ,17, 27, 68, 90, 100, 105 };
int l = 0, r = 9, m;
while (l <= r) {
m = (l + r) / 2;
if (list[m] == a) {
printf("find %d\n", a);
break;
}
else if (list[m] < a) {
l = m + 1;
}
else if(list[m] > a){ r = m - 1; }
if (l > r) { printf("\n找不到%d!!\n", a); }
}
}
int main() {
char countries[][10] = {"USA", "China", "British", "GitHub", "England"};
char str1[] = "***ADWADWQHD**";
qsort(countries, 5, sizeof(countries[0]), compare);
for (int i = 0; i < 5; i++) {
printf("%s\n", countries[i]);
}
search(18); // 找到数字18
}
祝福
希望我能在纠错中前进,和社区的大家一起进步,实现:
引用
[1] https://blog.csdn.net/edward_zcl/article/details/89451078
[2]https://blog.csdn.net/weixin_43738789
[3]https://blog.csdn.net/edward_zcl/article/details/89451078
这几篇写得都很好,推荐去看~