c语言复习:常见函数与错误

常用函数

1.pow

int pow(m,n)
{
    int j,s=1;
    for(j=1;j<=n;j++){
        s*=m;
    }
    return s;
}

2.快速排序(stdlib)

int main()
{
    int arr[10] = {9,8,7,6,5,4,3,2,1};
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr,sz,sizeof(arr[0]),cmp);
}
int cmp(const void* a,const void* b)
{
    return *(int*) b - *(int*) a;
}

3.快速排序

void quickSort(int* arr, int low, int high) {
	int i = low;
	int j = high;
	int temp = arr[low];
	if (i >= j)
		return;
	while (i != j) {
		while (i < j && arr[j]>=temp)
			j--;
		while (i < j && arr[i] <= temp)
			i++;
		if (i < j)
			swap(arr[i], arr[j]);
	}
	swap(arr[low], arr[i]);
	quickSort(arr, i + 1, high);
	quickSort(arr, low, i - 1);
}

4.选择排序

void select_sort(int* arr, int n)
{
    int max,tmp;
    for (int i = 0; i < n - 1; i++)
    {
        max = i;
        for (j = i + 1; j < n ; j++)
        {
            if (arr[j] > arr[max])
            {
                max = j;
            }
        }
        if (i != max)
        {
            tmp = arr[i];
            arr[i] = arr[max];
            arr[max] = tmp;
        }
    }
}

5.冒泡排序

void bubble_sort(int* arr, int n)
{
    int tmp;
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - i - 1; j++)
        {
            if (arr[j] < arr[j+1]) {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

6.任意数据类型冒泡排序

void bubble_sort(void* arr, int sz, int width, int(*cmp)(const void* e1, const void* e2))
{
	for (int i = 0; i < sz - 1; i++) {
		for (int j = 0; j < sz - i - 1; j++) {
			if (cmp((char*)arr + j * width, (char*)arr + (j + 1) * width)<0) {
				swap((char*)arr + j * width, (char*)arr + (j + 1) * width,width);
			}
		}
	}
}
int cmp(const void* e1, const void* e2) {
	return *(int*)e1 - *(int*)e2;
}
void swap(char* bf1, char* bf2, int width) {
	for (int i = 0; i < width; i++) {
		char e = *bf1;
		*bf1 = *bf2;
		*bf2 = e;
		bf1++;
		bf2++;
	}
}

7.判断素数

int Isprime(int x) {
	for (int i = 2; i <= sqrt(x); i++)
		if (x % i == 0)
			return 0;
	return 1;
}

8.

  • log(a) / log10(a)
  • exp(a)
  • sqrt(a)
  • round(a) // (int)(a+0.5)
  • ceil / floor
  • fabs()

9.

  • strcat
  • strcpy / strncpy (str1,str2,n)
  • strcmp ==返回为 0 ;/ strncmp
  • strlen 不包括 ’\0’
  • strlwr / strupr
  • strstr

10.文件操作

  • fopen(“FILE Path”,“w”) / w, r, a, rb, wb, ab, (+)
  • fclose
  • fwrite(ptr,size,count,stream)
  • fread(ptr,size,count,stream)

11.最大公约数

int gcd(int a, int b)
{
    if(b == 0)
        return a;
    return gcd(b, a%b);
}

常见错误

1.switch()

执行条件为真后不执行break会继续执行后面的case知道break;

2.printf()

打印的优先级问题。

3.const与指针

  • 常量指针 //指向地址可以改变,值不可以改变
const int *p;
int a = 4;
int b = 5;
p = &a;
*p = 5;  /*错误,不能通过指针p来改变值*/
a = 5;  /*正确,*p这时候也等于5*/
p = &b;  /*常量指针可以指向其他的地址*/
  • 指针常量 //指向地址不能改变,值可以改变
int *const p;
int a = 4;
int *const p = &a;/*要马上初始化,之后无法赋值*/
p = &b;/*错误,无法赋值*/
*p = 5;/*正确*/

4.ascll码

‘A’ = 65 / ‘a’ = 97 / ’0‘ = 48

5.if()

if() 括号内为赋值语句 :表达式右侧为0 不执行语句 1;表达式右侧不为0 执行语句 1;

6.转义字符

  • \ddd 1-3位8进制数 / \xhh 1-2位16进制数
  • ’ ,“ ,? 是转义字符

7.gets/fgets

  • gets / gets_s / scanf 丢弃换行符
  • fgets 若读入<=size-2 则保留换行符

8.scanf

  • scanf结束输入后不会舍弃回车符(残留在缓冲区
  • getchar()在缓冲区读入数据 / 输入设备->内存缓冲区->getchar()
  • 如果不同getchar取走scanf留下的‘\n’,接下来的scanf会直接读入
#include 
int main(void){
    char m[40];
    char n;
    printf("please input first str:\n");
    scanf("%s",m);
    printf("you input str is :%s\n",m); 
    printf("input second char :\n"); 
    scanf("%c",&n);   //程序将未输入而直接输出
    printf("now you input second char is :%c\n",n);
    return 0; 
}
  • scanf读入字符串时遇到空格不会将其之后存入str,但都残留在缓冲区

9.字符串比较

不能用 == ; strcmp

10.fclose与feof

  • fclose / 文件关闭,成功关闭返回值为0
  • feof 在文件读取已经结束的时候,判断文件为何结束(与ferror搭配)

到达文件末尾结束读取时返回非0值;

if (ferror(fp))
{
    puts("I/O error when reading");
}
else if (feof(fp))
{
    puts("End of the file reached successfully");
}

你可能感兴趣的:(c语言,算法,数据结构)