c语言学习(days08)
二分查找的实现
二分查找要求数组必须是有序的。基本思想是通过比较中间元素与目标值,缩小查找范围至左半部分或右半部分,直到找到目标或范围为空。
int main()
{int a[] = {1,2,3,4,5,6,7,8,9};int len = sizeof(a) / sizeof(a[0]);int begin = 0;int end = len - 1;int mid;int n = 5;while(begin <= mid){mid = (begin + end) / 2;if(a[mid] > n){end = mid - 1;}else if(a[mid] < n){begin = mid + 1;}else{break;}}if(begin <= end){printf("found index = %d\n",mid);}else{printf("not found\n");}return 0;
}
字符数组与字符串的区别
字符数组可以存储字符串,但字符串必须以空字符 \0
结尾。例如:
char s[100] = "atd18888888888"; // 自动补充\0
字符数组的输入输出方法
输出方式:
puts(s)
:输出字符串并自动换行。
printf("%s", s)
:输出字符串,不自动换行。
输入方式:
gets(s)
:不推荐,存在缓冲区溢出风险。
fgets(s, sizeof(s), stdin)
:安全输入,会保留换行符。
scanf("%s", s)
:遇到空格或换行停止,不读取空格。
计算字符数组容量与有效字符数
sizeof(s)
:返回数组总容量(字节数)。
strlen(s)
:返回有效字符数(不包括 \0
)。
char s[100] = "hello";
printf("Capacity: %d\n", sizeof(s)); // 100
printf("Length: %d\n", strlen(s)); // 5
字符串拷贝与续接
拷贝:
strcpy(dest, src)
:将 src
拷贝到 dest
,包括 \0
。手动实现:
int main()
{char s1[100] = "Hello";char s2[100];int i = 0;while(s1[i] != 0){s2[i] = s1[i];++i;}s2[i] = '\0';puts(s2);return 0;
}
续接:
strcat(dest, src)
:将 src
追加到 dest
末尾。
手动实现:
int main()
{char s1[100] = "Hello ";char s2[100] = "world";int i = 0;while(s1[i] != '\0'){++i;}int j = 0;while(s2[j] !='\0'){s1[i++] = s2[j++];}s1[i] = '\0';puts(s1);return 0;
}
字符串比较
strcmp(s1, s2)
按字典序比较:
返回值 > 0:s1
大于 s2.
返回值 = 0:s1
等于 s2
。
返回值 < 0:s1
小于 s2
。
手动实现:
int main()
{char s1[100] = "Hello";char s2[100] = "World";int i = 0;while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0'){++i;}printf("%d\n",s1[i] - s2[i]);return 0;
}
字符数组逆序
手动实现逆序:
int main()
{char s[100] ="Hello";int len = strlen(s);int i;for(i = 0;i < len / 2;++i){char t = s[i];s[i] = s[len -i-1];s[len-i-1] = t;}puts(s);return 0;
}