#include
int main(void)
{
char buf[]="Hello world!";
char ch[]={'a','b','c','d'};
printf("%s\n",ch);
return 0;
}
输出为:
abcdHello world!
#include
int main(void)
{
char buf[]="Hello world!";
char ch[]={'a','b','c','d','\0'};
printf("%s\n",ch);
return 0;
}
输出为:
abcd
两个例子说明了printf用%s进行输出遇到'\0'才停止
char buf[10]="123456789";
printf("%.3f",buf1+3);
输出结果为:
456
(1)字符串输入函数gets
格式:gets(字符数组)—建议用fgets( )
功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加’\0’
说明:输入串长度应小于字符数组维数
(2)字符串输出函数puts
格式:puts(字符数组)
功能:向显示器输出字符串
(输出完字符串后,再输出一个换行符)
说明:字符数组必须以‘\0’结束
ps:int n=100; char s[n];
gets(s);可以改成fgets(s, n, stdin);
gets很fgets区别:
gets总能获得一行,并放到s指向的内存里;
fgets仅获得一行的前n-1个字符。
gets会把一行结尾的’\n’字符换成’\0’
fgets保持一行字符的原样,在结尾添加一个’\0’
(3)字符串连接函数strcat
格式:strcat(字符数组1,字符数组2)
功能:把字符数组2连到字符数组1后面
返值:返回字符数组1的首地址
说明:字符数组1必须足够大 , 连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消, 新串最后加‘\0’
(4)字符串拷贝函数strcpy
格式:strcpy(字符数组1,字符串2)
功能:将字符串2,拷贝到字符数组1中去
返值:返回字符数组1的首地址
说明:字符数组1必须足够大 , 拷贝时‘\0’一同拷贝 ,不能使用赋值语句为一个字符数组赋值
(5)字符串比较函数strcmp
格式:strcmp(字符串1,字符串2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII码),
直到遇到不同字符或‘\0’为止
返值:返回int型整数,a. 若字符串1< 字符串2, 返回负整数
b. 若字符串1> 字符串2, 返回正整数
c. 若字符串1== 字符串2, 返回零
说明:字符串比较不能用“==”,必须用strcmp/.
(6)字符串长度函数strlen
格式:strlen(字符数组)
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘\0’在内
1. strncpy
格式:strncpy(数组1,数组2,n)
功能:把字符串2中的字符串复制到字符串1中,最多复制n个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
2. strncmp
格式:strncmp(数组1,数组2,n)
功能:比较字符串str1和str2的前n个字符。
3. strncat
格式:strncat(dest,src,n);
功能:把src中的前n个字符添加到dest结尾处(覆盖原dest结尾处的’\0’),并添加新的’\0’。
说明:src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的前n个字符串,返回指向dest的指针。
4. strcasecmp
格式:strcasecmp(s1,s2)
功能:strcasecmp()用来比较参数s1 和s2 字符串,比较时会自动忽略大小写的差异。
5. strncasecmp
格式:strncasecmp(dest,src,n);
功能:比较两个字符串的前n个字符,忽略大小写。
6. memset
格式:memset(a,’/0’,sizeof(a));
功能:将数组a清零。
7. memcpy
格式:mencpy(dest,src,n);
功能:从src的开始位置拷贝n个字节的数据到dest。如果dest存在数据,将会被覆盖。
9. mencmp
格式:memcmp(dest,src,n);
功能:比较内存区域dest以及src的前n个字符
1. sprintf
格式:sprintf(src,格式化字符串,argument1…)
功能:字符串合并
3. sscanf
格式:sscanf(src,格式化字符串,argument1…)
功能:字符串分割
ps:%[^=] 表示遇到等号停止
1. 冒泡排序
冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
eg:
# include
int main(void)
{
int a[] = {900, 2, 3, -58, 34, 76, 32, 43, 56, -70, 35, -234, 532, 543, 2500};
int n; //存放数组a中元素的个数
int i; //比较的轮数
int j; //每轮比较的次数
int buf; //交换数据时用于存放中间数据
n = sizeof(a) / sizeof(a[0]); /*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/
for (i=0; i<n-1; ++i) //比较n-1轮
{
for (j=0; j<n-1-i; ++j) //每轮比较n-1-i次,
{
if (a[j] < a[j+1])
{
buf = a[j];
a[j] = a[j+1];
a[j+1] = buf;
}
}
}
for (i=0; i<n; ++i)
{
printf("%d\x20", a[i]);
}
printf("\n");
return 0;
}
2. 选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
第一趟排序,找出待数组中最小的一个元素和第一个元素进行交换
第二趟排序,找出待数组中最小的一个元素和第一个元素进行交换
eg:
#include
int main()
{
int i,j,t,a[11]; //定义变量及数组为基本整型
printf("请输入10个数:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]); //从键盘中输入要排序的10个数字
for(i=1;i<=9;i++)
for (j=i+1;j<=10;j++)
if(a[i]>a[j]) //如果前一个数比后一个数大,则利用中间变量t实现两值互换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d", a[i]); //输出排序后的数组
printf("\n");
return 0;
}
3. 插入排序
插入排序原理很简单,将一组数据分成两组,分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待插入组元素个数为0。当然,插入过程中涉及到了元素的移动。
#include
int number[100];
int main()
{
int i=0,n,ii=0,temp=0;
printf("输入数字个数:\n");
scanf("%d",&n);
printf("输入%d个数:\n",n);
for(int j=0;j<n;j++)
scanf("%d",&number[j]) ;
for(i=1;i<n;i++)
{
temp=number[i];
ii=i-1;
while(ii>=0&&temp<number[ii]) //在这里改顺序 !!!
{
number[ii+1]=number[ii];
ii--;
}
number[ii+1]=temp;
}
for(i=0;i<n-1;i++)
printf("%d ",number[i]);
printf("%d\n",number[i]);
return 0;
}
4. 二分查找
适应情况:在一批有序数据中查找某数
基本思想:选定这批数中居中间位置的一个数与所查数比较,看是否为所找之数,若不是,利用数据的有序性,可以决定所找的数是在选定数之前还是在之后,从而很快可以将查找范围缩小一半。以同样的方法在选定的区域中进行查找,每次都会将查找范围缩小一半,从而较快地找到目的数。
eg:
#include
#include
int bin_search(int arr[], int left, int right, int key)
{
int mid = 0;
while (left < right)
{
mid = (left + right) >> 1;
//mid = (left + right)/2
if (arr[mid]>key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
return mid;//若找到,返回下标
}
return -1;//未找到
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int ret = bin_search(arr, left, right, 5);//用ret接收函数的返回值
printf("ret=%d\n", ret);
system("pause");
return 0;
}
今天一天课上下来,能感觉到难度相比之前有提升,相信接下来只会越来越难。还有就是之前讲过的知识点现在使用有些还是不大能想起来。而且今天所讲的内容较之前专业课上学的有很大不同及提升,之前只是学了最基础的,只能算是对C语言有了解,今后不断学习不断将强才能逐渐掌握。
(注:今日起不再把所有知识点整理上来,只挑选之前未掌握的以及易错易混淆的部分。)