字符串。字符串是以‘\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