1.字符串的基本概念和使用
1.1.字符串的概念:字符串是位于双引号中的字符序列,在内存中一“\0”结束,所占字节比实际多一个
注意:
1)可以把一个字符常量赋值给一个字符变量,但不能把字符串常量赋值给字符变量。
2)C语言中没有字符串变量,可以用字符数组来存放字符串。
1.2.用字符数组保存字符串:
方法1:char str1[4] = {"abc"};
方法2:char str2[4] = "a,b,c";
1.3.字符串的输入输出:
使用的格式字符串为“%s”,表示输入、输出的是一个字符串。
3.1用%s 输出字符串:printf("%s",ch1); // 输出原理:从给定的地址开始,输出字符直到遇到\0结束。
3.2用%s 输入字符串:scanc("%s",ch1); // 从键盘上接收一个字符串,保存在以ch1为首地址的字符数组中。
注意:1)如果输入的字符串有空格,则空格之后的字符无法被接收保存。
2)输入的字符串长度要小于数组的长度。
1.4.字符串长度的计算方法
1)使用字符串函数:strllen(str1);
2)以'/0'作为判断条件,遇到‘\0'就结束,\0之前的就是字符串的长度。
实例:字符数组的初始化和输入输出。
#include <stdio.h>
int main(int argc, const char * argv[]) {
// 定义并初始化一个字符数组
char ch[] = "Do you want join itheima?\n";
// 用%s输出字符串
printf("%s",ch);
// 定义变量,接收字符串
char ch1[10];
// 从键盘接收一个字符串
scanf("%s", ch1);
// 输出字符串
printf("%s", ch1);
return 0;
}
判断字符串中是否包含某个字符,如果包含,返回其首次出现的位置,否则返回-1。
#include <stdio.h>
// 定义函数,返回某字符在字符串中首次出现的位置,如果字符串中不包含该字符,则返回-1
int charPosition(char ch,char str[]){
int i = 0;
while (str[i] != ch) {
if (str[i] == '\0') {
return -1;
}
i ++;
}
return i;
}
int charPosition2(char key, char str[]){
// 先遍历字符串
for (int i = 0; str[i] != '\0'; i ++) {
if (str[i] == key) { // 如果str[i]等于key
return i; // 返回i
}
}
return -1; // 如果字符串中不包含key,返回-1
}
int main(int argc, const char * argv[]) {
// 定义并初始化一个字符串
char str[] = "I want join it heima!";
// 判断字符串是否包含某个字符
printf("%d", charPosition2('I', str));
return 0;
}
3.字符串函数的使用:
puts() 输出一个字符串,并且自动换行,参数可以是字符数组名,也可以是字符元素的地址。
gets() 输入一个字符串,会给出一个不安全警告,可以接收空格
strcat() 连接两个字符串:
strcat(A,B); // 把字符串B连接到A的后面,但要保证A的长度足够保存下B,否则会越界。
strcpy 字符串拷贝函数
strcpy(oldStr, newStr); // 把newStr拷贝到oldStr中,newStr会覆盖掉oldStr中的内容,oldStr要足够大,否则会越界。
strcmp 字符串比较函数
strcmp(str1, str2); // 比较str1和str2的大小,比较规则:从左到右逐个比较两个字符串中的字符,当两字符串中同一下标的两个字符不同时,返回两字符的ASCII码的差。
strlen 字符串的长度计算函数
strlen(str); // 计算str的长度(不包含‘\0’)
注意:
使用puts和gets必须包含头文件stdio.h
使用strcat,strcpy,strcmp,strlen需要包含string.h的头文件
应用举例:
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
// 定义两个字符串
char str1[100];
char str2[100];
// 输入一个字符串
printf("请输入第一个字符串:\n");
gets(str1);
// 输出一个字符串
printf("你输入的第一个字符串是:\n");
puts(str1);
// 再输入一个字符串
printf("请输入第二个字符串:\n");
gets(str2);
// 连接两个字符串并输出
printf("连接两个字符串:\n");
puts(strcat(str1, str2));
// 将一个字符串拷贝到另一个字符串中并输出
printf("将第二个字符串拷贝都第一个字符串中:\n");
puts(strcpy(str1, str2));
// 比较两个字符串
printf("第一个字符串与第二个字符串相比较: ");
printf("%d\n", strcmp(str1, str2));
// 计算字符串的长度
printf("第一个字符串的长度是:%lu\n",strlen(str1));
return 0;
}
4.字符串例题:使用gets()函数从键盘输入一个字符串,判断输入的有多少个单词,并将每个单词的首字母转换成大写。
#include <stdio.h>
// 定义函数,将字母转换成大写
char upper(char ch){
// 判断传人的字符是不是小写字母
if (ch >= 'a' && ch <= 'z') {
// 如果是小写字母,则转换成大写
ch = ch - 32;
} // 如果不是小写字母,则不作处理
return ch;
}
int main(int argc, const char * argv[]) {
// 定义一个字符串数组
char str[100];
// 输入一个字符串
gets(str);
// 定义变量,存储单词数
int count = 0;
// 如果输入不为空,即第一个元素不为‘\0’
if (str[0] != '\0') {
count ++; // 则至少有1个单词
str[0] = upper(str[0]); // 如果str[0]是小写字母,则转换为大写
}
// for循环从首元素开始,遇到‘\0’结束
for (int i = 0; str[i] != '\0'; i ++) {
if (str[i] == ' ' && str[i + 1] != ' ' && str[i + 1] != '\0') { // 如果str[i]是空格,且str[i + 1]不是空格和'\0'
count ++; // 则单词数+1
str[i + 1] = upper(str[i + 1]); // 将str[i + 1]转换成大写
}
}
// 输出单词数量
printf("输入了%d个单词\n", count);
// 输出转换后的字符串
printf("将单词的首字母转换成大写后的字符串为:\n");
puts(str);
return 0;
}