C语言字符串、宏定义及主函数介绍

希望你每天醒来都是阳光的,不会因为别人的几句话、几个表情和几个举止,影响自己的心情,好好生活,总会遇见美好的事。。。

----  网易云热评

一、字符串

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;

}

运行结果:

 

 

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值