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

简介: 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;
}


运行结果:

0a2653c851af460fa595bd959398a8f1.png

目录
相关文章
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
81 10
|
1月前
|
编译器 C语言
【C语言】宏定义详解
在C语言中,宏定义是一种强大的预处理器功能,用于在编译之前对代码进行替换和条件编译。宏定义通过预处理器指令进行定义和使用,能够使代码更加灵活和可维护。本文将对C语言中的宏定义进行全面的讲解,包括各种相关的预处理器指令及其用法。
123 7
|
1月前
|
编译器 C语言
【C语言】宏定义详解
宏定义(Macro Definition)是C语言预处理器的一部分,通过`#define`指令引入。宏定义在编译前的预处理阶段进行文本替换,即将代码中的宏名替换为定义的内容。
320 6
|
1月前
|
编译器 C语言
【C语言】宏定义在 a.c 中定义,如何在 b.c 中使用?
通过将宏定义放在头文件 `macros.h` 中,并在多个源文件中包含该头文件,我们能够在多个文件中共享宏定义。这种方法不仅提高了代码的重用性和一致性,还简化了维护和管理工作。本文通过具体示例展示了如何定义和使用宏定义,帮助读者更好地理解和应用宏定义的机制。
68 2
|
2月前
|
存储 算法 C语言
C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
150 4
|
3月前
|
C语言 C++
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
【C语言】解决不同场景字符串问题:巧妙运用字符串函数
|
4月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
134 8
|
4月前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
288 7
|
4月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
179 4
|
4月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。

热门文章

最新文章