一、字符串
1、字符串声明
#include <stdio.h> int main() { char str[] = "abc"; //用字符串字面值对字符数组进行初始化,这样就可以把字符串字面值里的所有内容都放到字符数组里(包括'\0'字符) printf("sizeof(str)是%d\n", sizeof(str)); //%s占位符从一个地址开始向后显示多个连续 //字符类型存储区的内容 printf("%s\n", "xyz"); printf("%s\n", str); return 0; }
2、关于字符串的函数
#include <stdio.h> #include <string.h> int main() { char str[10] = "abc"; char *p_ch = NULL; int size = 0, tmp = 0; size = strlen(str); //获得\0字符前所有有效字符的个数 printf("size是%d\n", size); printf("sizeof(str)是%d\n", sizeof(str)); //strlen的结果和sizeof的结果完全不同 p_ch = strcat(str/*必须是字符数组里的字符串*/, "def"); //把第二个参数里的有效字符追加到第一个参数的末尾,返回值就是第一个参数,可以代表合并后的字符串 printf("%s\n", p_ch); printf("%s\n", str); p_ch = strncat(str, "dkgjdsgs", 3/*最多追加的字符个数*/); printf("%s\n", p_ch); printf("%s\n", str); tmp = strcmp("abc", "abd"); //根据ASCII码比较字符串的大小 printf("比较结果是%d\n", tmp); tmp = strncmp("abc", "abd", 2/*比较的字符个数*/); printf("比较结果是%d\n", tmp); p_ch = strcpy(str, "xyz"); //把第二个参数里的内容复制到第一个参数的数组里,返回值就是第一个参数,可以代表复制以后的字符串 printf("%s\n", p_ch); printf("%s\n", str); p_ch = strncpy(str, "abc", 2/*最多复制的字符个数*/); //有可能不复制'\0'字符,所以可能保留部分原有内容 printf("%s\n", p_ch); printf("%s\n", str); memset(str, 'h'/*要设置的字符内容*/, 9/*要设置的存储区个数*/); //可以把字符数组里前n个字符存储区的内容设置成同一个字符 printf("%s\n", str); p_ch = strstr("abcdefghijklmn", "def"); //用来在一个字符串里找另外一个字符串的位置,用返回值表示找到的位置.如果没有找到则返回值是NULL printf("%s\n", p_ch); int val = atoi("24.5aaeged"); //把字符串开头的整数部分转换成整数类型 printf("val是%d\n", val); double dval = atof("23.5dfgsdg"); printf("dval是%lg\n", dval); return 0; } 运行结果: size是3 sizeof(str)是10 abcdef abcdef abcdefdkg abcdefdkg 比较结果是-1 比较结果是0 xyz xyz abz abz hhhhhhhhh defghijklmn
3、sprintf和sscanf
#include <stdio.h> int main() { char buf[20] = {0}; char ch = 0; int val = 0; float fval = 0.0f; printf("%c %d %g\n", 'w', 87, 4.3f); sprintf(buf, "%c %d %g\n", 'w', 87, 4.3f);//将内容写进buf printf("%s", buf); sscanf("p 23 6.4", "%c%d%g", &ch, &val, &fval);//从字符串中按格式读取出来 printf("%c\n", ch); printf("%d\n", val); printf("%g\n", fval); return 0; }
4、字符串练习
#include <stdio.h> #include <string.h> int main() { char buf[25] = {0}; //记录最终的字符串 char tmp[10] = {0}; //记录单个考试成绩转换得到的字符串 int grade = 0; //记录考试成绩 int num = 0; for (num = 1;num <= 5;num++) { //一共循环5次,每次处理一个考试成绩 printf("请输入一个考试成绩:"); scanf("%d", &grade); sprintf(tmp, "%d,", grade); //把单个考试 成绩转换成字符串记录到tmp数组里(考试成绩后有一个逗号) strcat(buf, tmp); //把tmp里的字符追加到buf末尾 } buf[strlen(buf) - 1/*最后一个逗号的下标*/] = '\0'; //把最后一个逗号替换成'\0'字符 printf("%s\n", buf); return 0; } #include <stdio.h> #include <string.h> int main() { char buf[10] = {0}; printf("请输入一个字符串:"); fgets(buf/*数组名称*/, 10/*数组里的字符类型存储区个数*/, stdin/*键盘*/); //从键盘得到字符串并记录到buf数组里 if (strlen(buf) == 9 && buf[8] != '\n') { scanf("%*[^\n]"); scanf("%*c"); } printf("%s\n", buf); printf("请输入一个字符串:"); fgets(buf/*数组名称*/, 10/*数组里的字符类型存储区个数*/, stdin/*键盘*/); //从键盘得到字符串并记录到buf数组里 printf("%s\n", buf); return 0; }
5、字符指针数组
#include <stdio.h> int main() { char *strs[] = {"abc", "def", "xyz"}; int num = 0; for (num = 0;num <= 2;num++) { printf("%s\n", strs[num]); } return 0; }
二、宏定义
#include <stdio.h> #define PI 3.14f #define CIRCLE(r) 2 * PI * r int main() { int radius = 0; float pi = 3.14f; printf("请输入半径:"); scanf("%d", &radius); printf("周长是%g\n", CIRCLE(radius)); printf("周长是%g\n", 2 * pi * radius); return 0; } #include <stdio.h> #define ABS(n) n >= 0 ? n : 0 - n //只要能当做数字使用宏必须编写成一个表达式 #define NEG(n) n = 0 - n //宏的参数代表的就是函数的存储区 int abs(int val) { //因为函数有存放返回值的 //存储区,所以采用任何方法 //计算得到结果都可以 if (val >= 0) { return val; } else { return 0 - val; } } void neg(int *p_val) { *p_val = 0 - *p_val; } int main() { int val = 0; printf("请输入一个数字:"); scanf("%d", &val); printf("绝对值是%d\n", abs(val)); printf("绝对值是%d\n", ABS(val)); neg(&val); printf("val是%d\n", val); NEG(val); printf("val是%d\n", val); return 0; } 运行结果: 请输入一个数字:-8 绝对值是8 绝对值是8 val是8 val是-8 #include <stdio.h> #define SUB(x, y) ((x) - (y)) int main() { printf("SUB(10, 5)是%d\n", SUB(10, 5)); printf("20 - SUB(10, 5)是%d\n", 20 - SUB(10, 5)); printf("SUB(20, 10 - 5)是%d\n", SUB(20, 10 - 5)); return 0; } 运行结果: SUB(10, 5)是5 20 - SUB(10, 5)是15 SUB(20, 10 - 5)是15 #include <stdio.h> #define SQUARE(n) ((n) * (n)) int main() { int val = 5; printf("SQUARE(++val)是%d\n", SQUARE(++val));//不建议使用自增自减作为参数 return 0; } 运行结果: SQUARE(++val)是49 #include <stdio.h> #define MIN(x, y) ((x) > (y) ? (y) : (x)) int main() { int val = 0, val1 = 0, val2 = 0; printf("请输入三个数字:"); scanf("%d%d%d", &val, &val1, &val2); printf("最小数字是%d\n", MIN(MIN(val, val1), val2)); return 0; }
宏操作符:
##是一个连接符号,用于把参数连在一起, 另外,如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开
#是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串
#define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x)) int main(void) { int y = 4; PSQR(y); PSQR(2 + 4); system("pause"); return 0; } 运行结果: the square ofyis 16. the square of2 + 4is 36. #define XNAME(n) x##n #define PXN(n) printf("x"#n" = %d\n",x##n) int main(void) { int XNAME(1) = 12;//int x1=12; PXN(1);//printf("x1 = %d\n", x1); system("pause"); return 0; } 运行结果: x1 = 12
多条件编译
#include <stdio.h> int main() { //#ifdef YI //如果编译的时候定义了YI这个宏,就编译前一组语句忽略后一组语句,否则编译后一组语句忽略前一组语句 #ifndef ER //如果编译的时候没有定义ER这个宏,就编译前一组语句忽略后一组语句,否则编译后一组语句忽略前一组语句 printf("1\n"); #else printf("2\n"); #endif return 0; } #include <stdio.h> int main() { int order = 0; printf("请点菜:"); scanf("%d", &order); #ifdef ZHAOBENSHAN if (order == 2) { //点的菜是小鸡炖蘑菇 printf("真没有\n"); } else { //点的菜是龙虾 printf("没有\n"); } #else if (order == 2) { printf("没有\n"); } else { printf("有\n"); } #endif return 0; } #include <stdio.h> int main() { #if defined(GONGCHANG) //编译时定义过GONGCHANG宏 printf("80%%\n"); //显示工厂店折扣比率 #elif !defined(GONGCHANG) && !defined(JINGPIN) //编译时既没有定义过GONGCHANG宏也没有定义过JINGPIN宏 printf("100%%\n"); //显示普通商店折扣比率 #else printf("120%%\n"); //显示精品点折扣比率 #endif return 0; }
三、主函数
1、主函数形式参数
#include <stdio.h> int main(int argc/*后一个参数里的指针个数*/, char *argv[]/*包含多个字符指针*/) { int num = 0; for (num = 0;num <= argc - 1;num++) { printf("%s\n", argv[num]); } return 0; }
2、形式参数利用
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int heads = 0, legs = 0, num = 0; if (argc < 3) { //没有提供头或者脚的数量 printf("命令错误\n"); return 0; } heads = atoi(argv[1]/*"40"*/); legs = atoi(argv[2]/*"100"*/); for (num = 0;num <= heads;num++) { if (4 * num + 2 * (heads - num) == legs) { printf("兔子有%d只,鸡有%d只\n", num, heads - num); return 0; } } printf("没有找到答案\n"); return 0; }
运行结果: