C语言细节要点易错点学习总结——长期更新

这篇博客主要总结C语言学习中容易出错,理解不到位的一些知识点——学习过程中总结,长期更新。

1.指针定义

int* p; 等价于 int p;
int* p=&a; 等价于 int
p; p=&a; 指针p指向变量a的地址。

2.数组指针

1.数组名可以作为数组首地址使用
2.对与数组a[10], a+i 等价于 &a[i]
3.a[i] 等价于 *(a+i)

3.指针变量作为参数,对指定地址赋值会改变原数据的值

4.结构体里不能定义本身但是可以定义自身类型的指针

5.结构体指针变量内元素的访问方式

p为结构体指针变量
(*p).id 等价于 p->id
(普通结构体变量可以直接使用 . 进行访问)

6.结构体数组初始化


#include <stdio.h>

struct test {
    int id;
    char name;
    char sex;

    //不初始化就定义结构体变量
    test() {}

    //只初始化id
    test(int _id) {
        id = _id;
    }

    //同时初始化id 和 name
    test(int _id, char _name, char _sex) {
        id = _id;
        name = _name;
        sex = _sex;
    }

    //也可以简化书写(只初始化name 和 sex)
    test(char _sex, char _name) : sex(_sex), name(_name) {}
} person1, person2, person3;


int main() {
    person1 = test(1);
    printf("id: %d \n", person1.id);
    person2 = test('F', 'A');
    printf("name: %c sex: %c\n", person2.name, person2.sex);
    person3 = test(3, 'B', 'M');
    printf("id: %d  name: %c sex: %c\n", person3.id, person3.name, person3.sex);
    return 0;
}

7.使用cin cout 输入输出

//引入头文件
#include "iostream"
using namespace std;

int a;
cin >>a;
cout <<a;

endl 用来换行

8.C++控制double型输出精度

引入 #include “iomanip”

	double a;
    cin >> a;
    //两位精度
    cout << setiosflags(ios::fixed) << setprecision(2) << a << endl;
    return 0;

9.读取文件

1.while…EOF型
EOF——End Of Line 值为-1 <crtl+z>可以触发 EOF状态
while(scanf("%d",&n) != EOF){

}
若要读取字符串
while(scanf("%s",str) != EOF){

}
或者使用get()函数
while(get(str) != NULL){

}
2.已知输入数据量采用
while(T–){
scanf("%d",&a);
…}

10.输入/输出字符串

1.gets() puts() 可以读取空格
gets()
换行符\n作为结束
puts()
输出一行字符串
自动加一个换行

#include <stdio.h>

int main() {
    char str[100];
    while (gets(str)) {
        puts(str);
    }

}

在这里插入图片描述

2.scanf("%s",str)/scanf("%c",str)
%s不能读取空格 换行符\n作为结束 %c可以读取空格
scanf 使用%c时会将换行符 \n 读入,需要用getchar吸收空格

#include <stdio.h>

int main() {
    char str[100];
    while (scanf("%s", str)) {
    //%s 不能读取空格
        printf("%s", str);
    }

}

在这里插入图片描述

%c前没空格,scanf将读取标准输入流中的第一个字符,%c前有空格,scanf则读取标准输入流中第一个非空白字符。


#include <stdio.h>

int main() {
    char a, b;
    scanf("%c", &a);//%c前无空格
    printf("%d",a);
 
    scanf(" %c", &b);//%c前有空格
    printf("%d",b);
}


测试结果:
在这里插入图片描述

3.getchar() putchar()
读取输出(结尾不自动加换行)单个字符
回车作为结束
scanf 使用%c时会将换行符 \n 读入,需要用getchar吸收空格

#include <stdio.h>

int main() {
    char key;
    key = getchar();
    putchar(key);

}

11.数据类型范围

int: [-231,2^31-1]

12.输出格式

int -->%d
long long int -->%lld

13.四舍五入(避免浮点数运算)

通过判断余数的值决定是否需要四舍五入

#include <stdio.h>

int main() {
    int a = 12345, b = 45678;


    //以b-a除100为例
    int ans = b - a;
    if (ans % 100 >= 50) {
        //需要四舍五入
        printf("需要四舍五入 %d", ans / 100 + 1);
    } else//不需要四舍五入
        printf("不需要四舍五入 %d", ans / 100);
    return 0;
}

还可以使用math.h头文件中的round函数,但是要涉及到浮点数运算

#include <stdio.h>
#include "math.h"

int main() {
    int a = 12345, b = 45678;
    //以b-a除100为例
    int ans = b - a;
    printf(" %f", round(ans / 100));
    return 0;
}
发布了33 篇原创文章 · 获赞 1 · 访问量 4163

猜你喜欢

转载自blog.csdn.net/qq_39827677/article/details/103802334