希望你每天醒来都是阳光的,不会因为别人的几句话、几个表情和几个举止,影响自己的心情,好好生活,总会遇见美好的事。。。
---- 网易云热评
一、字符串
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;
}
运行结果:

欢迎关注公众号:顺便编点程


2685

被折叠的 条评论
为什么被折叠?



