C语言----指针与字符串(高阶篇三十二)
字符串的输入输出
printf和scanf
格式控制符为%s /*s为string的意思*/
与字符型数据处理不同的是,用%s后面的变量一定是数组名或是字符指针
如:
char *pc=”string!”;
printf(“%s\n”,pc);
字符数组与指针
定义格式:区别
char *pc=”string!”;
char s[ ]=”string!”;
赋值:区别
pc=”string!”; /*指针可以在运算中赋值*/
s=”string!”; /*数组不允许*/
注意:
※字符指针在运算过程中可以用上面的方式赋值,但是用scanf或gets这类函数从键盘获取字符串时,一定要令其先指向某个数组。
如:scanf(“%s”,pc),运行时会报错,
※可以通过移动指针指向串中某个字符,如:
printf(“%c”,*(pc+2));
会输出r
※双引号也是一种运算符,它会求出一串字符的首地址。上面的”string!”相当于用&求出’s’的地址赋值给pc。
※字符数组(字符串)初始化,系统会自动按顺序填充数组元素。平时运行时不能用=号给数组赋值,因为数组名是只读的。
字符串数组与指针
所有的字符串都是一维数组,那“字符串数组”肯定是二维数组。
字符串之间的运算都要通过字符串函数
程序1
选择排序法给5个字符串从小到大排序
// 32-1排序法给5个字符串从小到大排序.c #include <stdio.h> #include <string.h> void swap(char *s1, char *s2) { char s3[10]; //字符串交换 strcpy(s3, s1); strcpy(s1, s2); strcpy(s2, s3); } main() { char str[5][10]; //定义五个串,不超过十个字符 \0 占一个 printf("请输入五个字符串:\n"); for (int i = 0; i < 5; i++) gets(str[i]); //输入五个字符串 for (int i = 0; i < 5; i++) { for (int j =i+1; j < 5; j++) { if (strcmp(str[i],str[j])>0) //如果 str[i]大于str[j] 就会返回1,否则就是0; { swap(str[i], str[j]); //交换变量 } } } //输出字符 printf("输出排序后的字符串:\n"); for (int i = 0; i < 5; i++) { puts(str[i]); } }
字符串比较规则:
比较的时候,从字符串左边开始,依次比较每个字符,直到出现差异、或者其中一个串结束为止。
比如ABC与ACDE比较,第一个字符相同,继续比较第二个字符,由于C的ASCII码比B大,所以不再继续比较,结果就是后面一个串大。
再如ABC与ABC123比较,比较三个字符后第一个串结束,所以就是后面一个串大。
所以,长度不能直接决定大小,字符串的大小是由左边开始第一个差异字符决定的。