函數不安全報錯
#include <stdio.h>
int main() {
int age = 0;
printf("請輸入你的年齡:\n");
scanf("%d",&age);
printf("你的年齡為:%d",age);
return 0;
}
在使用scanf()函數時,編譯器報錯如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN5YDMyQ2M1U2NzY2MwImYyYzXxUjNzEjM4IzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
解決辦法:
- 使用scanf_s() 替換scanf()函數
缺點:scanf_s()是vs編輯器提供的,如果移植到其它編譯器将不能識别。
- 使用在代碼第一行加上==#define _CRT_SECURE_NO_WARNINGS 1==
- 在項目屬性中設定預處理器定義中加上:_CRT_SECURE_NO_WARNINGS
- 避免每次寫代碼都需要手動添加
找到vs安裝目錄下的這個檔案:
編輯檔案,加上這一行代碼:==#define _CRT_SECURE_NO_WARNINGS 1==
儲存并退出。這樣在建立的源檔案中将自動添加這句話。
1. 常量
- 字面常量
- ==const==修飾的常變量
- #define 定義的辨別符常量
- 枚舉常量
#include <stdio.h>
#define MAX 100 //3.define定義的辨別符常量
int main() {
3;//1.字面常量
const int var = 10;//2.const 修飾的常變量
//4. 枚舉常量
enum Color
{
Red,
Blue,
Yellow
};
enum Sex {
Man=1,//可以手動修改起始的數值
Woman,
};
enum Color color = Red;
enum Sex she = Woman;
printf("%d\n",color);//enum 内部從0開始
printf("%d\n",she);//輸出2
return 0;
}
2.字元串
- 定義
由雙引号引起來的==一串字元==稱為字元串字面值,簡稱字元串。
字元串的結束标志是一個\0的轉義字元。在計算字元串長度時,\0是結束标志,不會算作字元串内容。
#include <stdio.h>
int main() {
char arr[] = "abcdefg";//用數組存放字元串
printf("%s\n",arr);
return 0;
}
1.1 列印字元串和一串字元
- 為什麼出現亂碼?
在列印字元數組a時,列印是從字元 'a' 開始,直到字元串結束标志 \0,這時列印就結束了。
而再列印字元數組b時,列印從字元 'a' 開始,在列印完字元 'c' 後并==沒有字元串結束标志==,這時列印就會繼續,因為數組都是存儲在記憶體當中的,列印會一直向下進行,直到碰到字元串結束标志才會停止列印。
- 如果給數組b手動加上結束标志?
成功消除亂碼。
1.2 計算字元串長度函數strlen()
strlen()用于計算字元串長度。
#include <stdio.h>
int main() {
char a[] = "abc";//用數組存放字元串
char b[] = { 'a','b','c' };
int len_a = strlen(a);
int len_b = strlen(b);
printf("%s\n",a);
printf("%d\n", len_a);
printf("%s\n",b);
printf("%d\n", len_b);
return 0;
}
用大括号括起來的字元的數組長度是随機值(不确定值)。
1.3 用sizeof函數求取數組長度:
3. 轉義字元\
常用轉義字元 | 含義 |
---|---|
\t | 水準制表符 |
\v | 垂直制表 |
\o | 空字元 |
\n | 換行符 |
\’ | 代表一個單引号字元 |
\” | 代表一個雙引号字元 |
\\ | 代表一個反斜線字元"\" |
4.注釋
c語言風格注釋
==這種注釋是不支援嵌套的==
c++風格注釋:
- vs批量注釋快捷鍵:
注釋:Ctrl + K,Ctrl + C;==(c代表comment,注釋)==
取消注釋: Ctrl +K,Ctrl + U;==(u代表uncomment,取消注釋)==
5. if -else
- 符号判斷器:輸入一個值,判斷是正數還是負數;
#include <stdio.h>
int main() {
int var = 0;
scanf("%d",&var);
if (var >= 0) {
printf("這是個正數.\n");
}
if (var == 0) {
printf("這是0.\n");
}
else {
printf("這是個負數!\n");
}
return 0;
}
- 成績判斷器:給成績分等級
#include <stdio.h>
int main() {
int score = 0;
scanf("%d", &score);
if (score <=100&&score>0) {
printf("成績有效\n");
if (score >= 85) {
printf("成績優秀\n");
}
else if (score >= 70) {
printf("成績一般\n");
}
else if (score >= 60) {
printf("成績合格!\n");
}
else {
printf("不合格!\n");
}
}
return 0;
}
6. while
#include <stdio.h>
int main() {
int i = 10;
while (i>=0) {
printf("%d\t",i);
i--;
}
return 0;
}
while()括号内是條件,隻要滿足條件,就執行大括号内的代碼;
如果括号内為常量,例如while(1),while(true),while(3>2)
則循環沒有跳出的條件,視為死循環。
7. do - while
#include <stdio.h>
int main() {
int i = 0;
while (i>=10) {
printf("while");
i--;
}
int j = 0;
do {
printf("do-while");
j++;
} while (j >= 10);
return 0;
}
do -while 無論是否滿足while括号内的條件都會執行一次do裡面的内容。
8. for
- 九九乘法表:
#include <stdio.h>
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
int pro = i * j;
printf("%d * %d = %d\t",j,i,pro);
}
printf("\n");
}
return 0;
}
9. switch-case
- 電腦:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int demo09() {
int num1, num2;
char operator;
while (1) {
scanf("%d %c %d", &num1, &operator,&num2);
switch (operator)
{
case '+':
printf("%d %c %d = %d\n", num1, operator,num2, num1 + num2);
break;
case '-':
printf("%d %c %d = %d\n", num1, operator,num2, num1 - num2);
break;
case '*':
printf("%d %c %d = %d\n", num1, operator,num2, num1 * num2);
break;
case '/':
printf("%d %c %d = %.2f\n", num1, operator,num2, (float)num1 / (float)num2);
break;
default:
break;
}
}
return 0;
}
10 算術運算符
10.1 單目運算符
- !:邏輯反操作
- &:取位址
- sizeof:操作數的類型長度(以位元組為機關)
- ~:對一個二進制數按位取反
10.2 關系操作符
- || :或
- &&:與
- !:非
10.3 三目操作符
#include <stdio.h>
int main() {
int max = 0;
int a, b;
scanf("%d %d",&a,&b);
max = a > b ? a : b;
printf("max=%d\n",max);
return 0;
}