Standard C Episode 6

字符串。字符串是以‘\0‘结尾的字符序列。C语言字符串在内存中的存储规则:按照串中字符出现的顺序在内存中连续存储,末尾是字符串结束符‘\0‘。
注:‘\0‘(查ASCII码表可知‘\0‘就是0)是表示字符串的字符,它的位置决定了一个字符串中有效字符的个数。

字符串常量。字符串常量在源程序词法记号中属于"文字",它和其他文字"数字、布尔文字、以及字符"一样。但区别是“字符串常量文字代表的是首字符地址”。

注:编译器编译时候会把源程序中重复出现的相同文字只存储一回。多个连续的字符串也会被当做一个字符串处理。例如源程序中的"abcd""efg"就被编译器在编译时认定为字符串"abcdefg"

 1 /*
 2  * 字符串练习
 3  *
 4  * C语言标准库函数printf()提供了简单的字符串输出方法。具体地,printf()将从指定地址开始输出字符直到发现字符串结束符‘\0‘
 5  * */
 6
 7 #include <stdio.h>
 8
 9 int main()
10 {
11     char *p_str = "abc";/*
12         C语言用字符串的首字符的地址代表一个字符串。也就是说"abc"被处理为一个地址。字符串始于该地址止于字符串结束符‘\0‘
13                         */
14     printf("\"abc\"按照十六进制数输出是0x%X\n", "abc");
15     printf("\"abc\"按地址数据格式输出是0x%p\n", "abc");
16     printf("%c\n", *p_str);
17     printf("%s\n", p_str);//与格式化字符串中占位符%s对应的实参应该是一个字符串的地址
18
19     char ch = ‘x‘;
20     p_str = &ch;
21     printf("%s\n", p_str);//printf执行输出过程中将从p_str给出的地址开始输出字符直到发现‘\0‘为止。显然我们不清楚什么时候才能发现‘\0‘,这是危险的。
22
23
24     return 0;
25 }
 1 /*
 2  * 字符串练习
 3  * */
 4
 5 #include <stdio.h>
 6
 7 int main()
 8 {
 9     char *p_str = "abcdef";
10     //*p_str = ‘x‘;//字符串"abcdef"是字符串常量,是词法记号中所称的文字。不可以修改。此语句编译无错误,运行则会导致操作系统终止程序报告段错误。
11     printf("%p\n", "abcdef");
12     printf("p_str是%p\n", p_str);//打印结果同于printf("%p\n", "abcdef");因为编译器编译时将相同文字只存储一次。
13     printf("%s\n", "abcde""fg");
14
15
16
17     char str[] = "abc";
18     //char str[3] = "abc";//数组长度不够,字符串结束符‘\0‘无法存放,编译器gcc编译不报错,字符串结束符‘\0‘被编译器舍弃
19     char str1[] = {‘a‘, ‘b‘, ‘c‘};//字符数组str1只是一个字符数组,不是一个有效的字符串
20     char str2[] = {‘a‘, ‘b‘, ‘c‘, ‘\0‘};//字符数组str2就是一个有效的字符串
21     printf("%s\n", str);
22     printf("%s\n", str1);//printf执行输出从str1给出的地址开始输出字符直到发现‘\0‘为止。显然我们不清楚什么时候才能发现‘\0‘,这是危险的。
23     printf("%s\n", str2);
24     printf("字符数组str[]的元素个数是%d\n", sizeof(str) / sizeof(str[0]));
25     str[0] = ‘Y‘;
26     str[1] = 0;
27     printf("%s\n", str);
28
29
30 }
 1 /*
 2  * 字符串输入
 3  * 标准库函数scanf() 和 fgets()可以用来从键盘读取字符串
 4  * fgets()通过指定参数避免了出现字符数组溢出问题。
 5  *
 6  *
 7  * */
 8
 9 #include <stdio.h>
10 #define N    10
11 main()
12 {
13     char buf[N];
14     //scanf("%s", buf);
15     fgets(buf, 10, stdin);//从stdin读入9个字符放入buf,然后继续放入字符串结束符
16     printf("%s\n", buf);
17 }
 1 /*
 2  * 字符处理函数练习
 3  * strlen()练习
 4  *
 5  *
 6  * */
 7 #include <string.h>
 8 #include <stdio.h>
 9
10 int main()
11 {
12     char ch[] = "abc";
13     printf("字符串\"abc\"有%d个字符\n", strlen("abc"));
14     printf("字符串ch有%d个字符\n", strlen(ch));
15
16     return 0;
17 }
 1 /*
 2  * 字符串处理标准库函数练习
 3  *
 4  * strcat(), strncat()练习
 5  *
 6  * strcat合并字符串容易导致字符串数组溢出,用strncat可以用个参数有效防止字符串数组溢出
 7  * */
 8
 9 #include <stdio.h>
10 #include <string.h>
11
12 main()
13 {
14     char str1[20] = "abc";
15     printf("str1字符串长度为%d\n", strlen(str1));
16     strcat(str1, "xyz");
17     printf("合并字符串\"xyz\"到字符串str1之后,字符串长度为%d\n", strlen(str1));
18
19 }
 1 /*
 2  * 字符串处理标准库函数练习
 3  *
 4  * strcpy(), strncpy()练习
 5  *
 6  * strcpy复制时候容易导致目标字符数组溢出,strncpy则可以通过参数防止溢出
 7  *
 8  * */
 9
10 #include <stdio.h>
11 #include <string.h>
12
13 main()
14 {
15     char str1[20] = "abcefg";
16     printf("str1是%s\n", str1);
17     strcpy(str1, "xyz");
18     printf("复制字符串\"xyz\"到字符串str1之后,字符串长度为%d\n", strlen(str1));
19     printf("str1是%s\n", str1);
20
21 }
 1 /*
 2  * 字符串处理标准库函数练习
 3  * 比较两个字符串大小(ASCII码大的字符大于ASCII码小的字符)
 4  *
 5  * strcmp(), strncmp()练习
 6  * strncmp()可以实现比较两个字符串的前n个字符大小
 7  * */
 8
 9 #include <stdio.h>
10 #include <string.h>
11
12 main()
13 {
14     char str1[20] = "abcefg";
15     char str2[] = "ABC";
16     printf("str1是%s\n", str1);
17     printf("str2是%s\n", str2);
18     printf("strcmp(str1, str2)是%d\n", strcmp(str1, str2));
19
20 }
 1 /*
 2  * 文件名:string.h
 3  * 描述:字符串处理函数练习
 4  *
 5  *       (1) int strcmp(const char *s1, const char *s2)   //compare two strings
 6  *           int strncmp(const char *s1, const char *s2, size_t n)
 7  *
 8  *       (2) char * strcat(char *dest, const char *src) //concatenate tow strings
 9  *           char * strncat(char *dest, const char *src, size_t n)
10  *
11  *       (3) char * strcpy(char *dest, const char *src) //copy  a string
12  *           char * strcpy(char *dest, const char *src, size_t n)
13  *
14  *       (4) size_t strlen(const char *s) //calculate the length of a string
15  *
16  *
17  *
18  * */
19 #include <stdio.h>
20 #include <string.h>
21
22 int main()
23 {
24     char str[] = "i love you" "chen xin";
25     char tmp[100] = {0};
26
27     printf("%s\n", str);
28     if (strcmp(str, "i love you chen xin") != 0) {
29     strncpy(tmp, str, 10);
30     strncat(tmp, " CHEN XIN", 1);//string concatenate
31     strcpy(str, tmp);
32     strcat(str, "CHEN XIN");
33     }
34
35
36
37
38     printf("STRING(length %d ): %s\n", strlen(str), str);
39
40     printf("strcmp(\"ILOVEYOU\", \"iloveyou\") RETURN %d\n",
41      strcmp("ILOVEYOU", "iloveyou"));//<0
42     printf("strcmp(\"iloveyou\", \"iloveyou\") RETURN %d\n",
43      strcmp("iloveyou", "iloveyou"));//=0
44     printf("strcmp(\"iloveyou\", \"ILOVEYOU\") RETURN %d\n",
45      strcmp("iloveyou", "ILOVEYOU"));//>0
46     printf("tmp=>%s\nstr=>%s\n", tmp, str);
47     printf("strncmp(tmp, str, 5)=>%d\n", strncmp(tmp, str, 5));
48
49
50
51     return 0;
52 }
 1 /*
 2  * Discreption: 从键盘上读入用户名称,读入用户输入的密码;
 3  *                 比较用户名密码是否匹配:
 4  *                 匹配:print登陆成功;
 5  *                 不匹配:print重试,剩余n(n<3)次
 6  *                 当n=3,提示登陆失败
 7  *
 8  * */
 9
10 #include <stdio.h>
11 #include <string.h>
12
13 #define N    10
14 int check_user(char str1[], char str2[]);
15
16 main()
17 {
18     char name[N] = {0};
19     char pw[N] = {0};
20     unsigned retry = 0;
21     unsigned times = 3;
22     do {
23         printf("用户名:");
24         scanf("%s", name);
25         printf("密码:");
26         scanf("%s", pw);
27         if (!strcmp(name, "admin") && !strcmp(pw, "123456")) {
28             printf("登陆成功.\n");
29             retry = 0;
30         }
31         else
32         {
33             retry = 1;
34             times--;
35             printf("用户名/密码错误,还可以尝试%d次.\n", times);
36         }
37     } while (times > 0 && retry);
38 }
 1 /*
 2  带参数的main函数
 3  */
 4
 5 #include <stdio.h>
 6 int main(int argc, char *argv[])
 7 {
 8     int loop = 0;
 9     for (loop = 0; loop < argc; loop++) {
10         printf("%s\t", argv[loop]);
11     }
12     printf("\n");
13
14     for (loop = 0; loop < argc; loop++) {
15         printf("%s\t", *(argv + loop));
16     }
17     printf("\n");
18
19 }
时间: 2024-10-17 10:54:01

Standard C Episode 6的相关文章

Standard C episode 1

计算机内存可以记录大量的信息,只有记录在内存中的信息才是可以使用的.计算机的内存管理者是操作系统.程序可以根据需要向操作系统申请存储区,所有存储区必须先申请并经过操作系统分配后才能由程序使用.我们知道计算机里的信息可以简单划分为: /指令       /控制信息 信息 -            \控制字       \数据信息                     |              /              \      数值信息     非数值信息       /    \ 

Standard C Episode 3

程序语言中的控制流语句用于控制各计算操作执行的次序.控制流结构有:(1)顺序结构(2)分支结构(3)循环结构 if...else语句是经典的分支结构控制语句,同样"switch (表达式)...case 常量表达式" 语句也可以实现分支处理."表达式"可以是任何表达式,"常量表达式"也可以是任何常量表达式.case分支一般包含多条语句时也不必用大括号括起来,因 为每一个case分支只会给出switch分支结构中语句执行的开始位置,而不确定终止位置

Standard C Episode 5

理解变量标识符的作用域和可见性,以及变量生存期. (1)标识符的作用域和可见性     作用域:作用域是一个标识符在源程序中有效的区域.     可见性:程序运行到某一点,能够引用到的标识符,就是该处可见的标识符. (2)变量生存期:     变量的生存期就是指变量从创建到销毁的时间范围.变量按照生存期分“静态生存期”和“动态生存期”.静态生存期:如果变量的生存期与程序的运行期相同,则称该变量具有“静态生存期”; 动态生存期:变量生存期始于创建声明点,结束于作用域结束处. 注意:源程序声明(定义

Standard C Episode 2

源程序中,但凡可以出现某种类型的数据的地方都可以用同类型的表达式替换.一个表达式的类型,取决于多个方面. 操作符有单目操作符和双目操作符, 还有三目操作符(? : 是C语言唯一的一个三目操作符)."目"指的是操作数的个数! C语言没有指定同一操作符的多个操作数的计算顺序(除了&& || ? : 和,).所以语句x = f() + g();的计算结果依赖不同的编译器. 1 /* 2 * 文件名: 3mu.c 3 * 描述:(1)一个表达式的类型取决于多个方面(表达式的操作

Standard C Episode 4

稍微简单的复杂数据类型:数组 计算机程序处理的对象是数据信息(计算机中的信息包括数据信息和控制信息),计算机内存可以存储大量信息,姑且可以认为只有存储在内存中的数据信息才是可 以使用的.内存由操作系统管理,程序要使用内存存储空间需要向操作系统申请并被成功分配后才可以使用,C语言提供的变量声明(定义)语句可以实现向操作系 统申请存储空间. C语言提供的变量声明(定义)语句实现向操作系统申请存储区(存储空间),变量名有"两个代表",一是代表所申请到的存储区,一是代表存储区里面存放的数 据信

Standard C Episode 8

C语言函数和程序结构 通过函数可以把大的计算任务分解成若干个较小任务,从而使得思路更加清晰,同时函数也大大提高了代码的复用率,提高了工作效率.要注意的是多函数之间应该尽可能地高聚合低耦合.另一方面,一个程序可以保存在一个或者多个源文件中.各个文件可以单独编译. 注意:一般地,头文件中不会放那些在程序运行时发生具体效应的语句.例如声明(定义)一个变量的语句是不会放在头文件中的.再例如结构体声明(定义)语句就可以放头文件里,但结构体变量声明(定义)语句是不会放在头文件中的. make工具可以用来进行

Standard C Episode 9

typedef关键字可以给数据类型起别名. 结构体.结构体可以如下定义一个结构体变量 1 /* 2 * 结构体 3 * */ 4 #include <stdio.h> 5 /*struct { 6 int age; 7 char gender; 8 float height; 9 } student;//声明(定义)无名结构体的同时定义了结构体变量student 10 */ 11 /*struct student { 12 int age; 13 char gender; 14 float h

Standard C Episode 10

标准库函数malloc/calloc/realloc以及free的堆内存分配与回收 1 /* 2 * malloc练习 3 * 4 * */ 5 6 #include <stdlib.h> 7 #include <stdio.h> 8 9 int main() 10 { 11 int *p_value = NULL; 12 13 p_value = (int *) malloc (1 * sizeof(int)); 14 if (p_value) { 15 printf("

Standard C Episode 7

编译预处理 #define可以定义宏.宏可以带参数,叫做带参数的宏,其参数叫做宏的参数. #undef 可以解除宏的定义. 1 /* 2 宏练习 3 */ 4 5 #include <stdio.h> 6 #define NEG( r) r = 0 - r 7 8 main() 9 { 10 int value = 4; 11 NEG(value); 12 printf("value是%d\n", value); 13 } 1 /* 2 宏练习 3 */ 4 #includ