第八课 字符串

字符串

数组复习例题

  1. 从键盘输入 10 位同学的考试成绩存入数组,按照低分到高分排序;然后输出;

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    #include <stdbool.h>
    #include <stdio.h>
    #define arrLen 10
    
    void print(int a[], int size) {
    	for (int i = 0; i < size; i++) {
    		printf("%d ", a[i]);
    	}
    	printf("\n");
    }
    
    // sort 冒泡排序
    void sort(int a[], int size) {
    	// 外层循环 0:n-1 次
    	for (int i = 0; i < size - 1; i++) {
    		bool exchange = false;
    		// 内存循环 1:n-i 次
    		for (int j = 1; j < size - i; j++) {
    			if (a[j - 1] > a[j]) {
    				int t = a[j - 1];
    				a[j - 1] = a[j];
    				a[j] = t;
    			}
    		}
    		if (exchange) {
    			break;
    		}
    	}
    }
    
    int main(int argc, char const* argv[]) {
    	int a[arrLen];
    	printf("请输入 10 个成绩:\n");
    	for (int i = 0; i < arrLen; i++) {
    		scanf("%d", &a[i]);
    	}
    	printf("正在排序...\n");
    
    	sort(a, arrLen);
    	print(a, arrLen);
    	return 0;
    }
    
  2. 数组元素拆分,从键盘输入 n,表示数组中存储元素个数,然后输入 n 个数存入数组,把偶数放在b 数组,奇数放在 c 数组中;

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    #include <stdio.h>
    
    void print(int a[], int size) {
    	for (int i = 0; i < size; i++) {
    		printf("%d ", a[i]);
    	}
    	printf("\n");
    }
    
    int inputNum() {
    	printf("请输入一个数:");
    	int v = 0;
    	scanf("%d", &v);
    	return v;
    }
    
    void inputArray(int a[], int size) {
    	printf("请依次输入 %d 个数值\n", size);
    	for (int i = 0; i < size; i++) {
    		scanf("%d", &a[i]);
    	}
    }
    
    int main(int argc, char const* argv[]) {
    	int n = inputNum();
    	int a[n];
    	inputArray(a, n);
    	int b[n], c[n];
    	int b1 = 0, c1 = 0;
    	// 判断数组元素是奇数还是偶数,并且赋值到规定数组
    	for (int i = 0; i < n; i++) {
    		if (a[i] % 2 == 0) {
    			b[b1] = a[i];
    			b1++;
    		} else {
    			c[c1] = a[i];
    			c1++;
    		}
    	}
    	print(b, b1);
    	print(c, c1);
    	return 0;
    }
    
  3. 已知数组 a,将 0 集中放在数组前面,把 1 放在后半部分;

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    #include <stdio.h>
    #define arrLen 10
    
    void print(int a[], int size) {
    	for (int i = 0; i < size; i++) {
    		printf("%d ", a[i]);
    	}
    	printf("\n");
    }
    void core(int a[], int size) {
    	int i = 0, j = size - 1;
    	while (i < j) {
    		if (a[i] == 0) {
    			i++;
    			continue;
    		}
    		if (a[j] != 0) {
    			j--;
    			continue;
    		}
    		int t = a[i];
    		a[i] = a[j];
    		a[j] = t;
    	}
    }
    
    int main(int argc, char const* argv[]) {
    	int a[arrLen] = {1, 1, 0, 0, 1, 0, 1, 1, 1, 0};
    	// result  a[] = {0,0,0,0,1,1,1,1,1,1};    4个0,6个1
    	core(a, arrLen);
    	print(a, arrLen);
    	return 0;
    }
    

字符串

字符串常量的表示,一定要加双引号,字符常量要加单引号;

字符串概念:是有若干多个符号组成;

例如:

1
2
3
""     // 这是字符串,表示空串
"a"
"abcde"

字符串变量:

in c program ,没有字符串数据类型;字符串是用字符数组来存储;字符串变量的定义也就是定义字符数组;

1
char st[100];     // 字符数组

字符赋值,只有在定义字符串时,才能整体赋值,定义后不能整体赋值;

字符数组的 sizeof 是 1,每个下标只能存储一个字符;结尾是 \0,表示结束,存储时仅加一次,若是用户删除插入操作,必须自己手动添加;

在访问字符串时,只要遇到结束标志,就停止访问;

1
2
3
4
st[i] != '\0';     // 访问字符串时的条件
char st[5] = "aaaaa";     // 溢出
char st[5] = "aaaaa\0";   // 实际存储方式
char st[] = "aaaaa";      // 该存储空间是 6   重点!!,即字符数组额外占用一个char
1
2
scanf("%s",字符串名);  // 字符串的输入方式,无须+ 取址符号
printf("%s",st);     // 输出

使用 scanf 获取字符串,输入时不能带有空格,否则空格后面就自动断开;

1
2
fgets     // 输入字符串
fputs     // 输出字符串

字符串常量

1
2
3
4
5
6
char *s = "hello";
char *s1 = "hello";
// s 和 s1 指向的是同一个地址,地址很小,位于程序的代码段,只读!!
// 只读不可改
// 想要修改的字符串
char s[] = "hello"

c program 关于字符串操作的一些库函数

函数都是在 <string.h> 头文件中;

1
2
3
4
5
6
7
8
9
strlen(st);    // 求字符串长度(个数),不包含结束标志,sizeof 包含
 		           // sizeof 计算的是总共存储空间,而不是仅仅字符串空间

strcat(s1,s2); // 将字符串 s2 连接在 s1 的后面,构成一个整体; 要求字符串 s1 存储空间必须够大

strcpy(s1,s2); // 实现字符串的拷贝,在c语言中字符串不允许赋值,要想对字符串进行赋值,必须用赋值函数
st1 = st2   // Error
strcmp(s1,s2); //比较字符串st1与st2是否相等,若是相等返回0,若是不等,返回-1/1;  
// 逐一位置比较,如果遇到不相等,停止比较,如果s1字符 ascll 值大返回1(s1>s2),若是s1的 ascll 值小,返回-1(s1<s2)

若是 getchar 获取一个字符,想要的不是字符,而是数字本身,减去 ‘0’ 即可得到数字本身,看下面例子:

1
2
3
n = getchar();    // input 2
n-0 = 50;       // ascll  即无用功,n 本身就是50
n-'0' = 2;      // 数字本身  50-48=2

字符串例题

  1. 字符串操作:从键盘输入一串字符,把其中大写字母改成小写字母;

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    #include <stdio.h>
    
    int main(int argc, char const* argv[]) {
    	char p[100];
    	fgets(p, 100, stdin);
    	for (int i = 0; i < p[i] != '\0'; i++) {
    		if (p[i] >= 'A' && p[i] <= 'Z') {
    			p[i] += 32;
    		}
    	}
    	fputs(p, stdout);
    	return 0;
    }
    
  2. 字符串统计:从键盘输入一串字符(一句话),统计这句话中单词的个数;

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    #include <stdio.h>
    
    int count(char a[]) {
    	int sum = 0;
    	for (int i = 0; i < a[i] != '\0'; i++) {
    		if (a[i] == ' ') {
    			sum++;
    		}
    	}
    	return sum + 1;
    }
    int main(int argc, char const* argv[]) {
    	char a[100];
    	fgets(a, 100, stdin);
    	int c = count(a);
    	printf("%d\n", c);
    	return 0;
    }
    
Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy