C语言基础10
数组
字符数组
字符串的基础操作
字符串拼接
- 语法:
strcat(数组名(“字符串1”),需要拼接的字符串("字符串2"));
- 引用:
string.h
- 案例:
/*************************************************************************
> File Name: demo01.c
> Author: FPF
> Description: 字符串拼接,将两个字符串拼接为一个字符串
> Created Time: 2025年02月18日 星期二 09时28分49秒
************************************************************************/
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char name[20];
printf("请输入您的姓名:\n");
fgets(name,sizeof(name)/sizeof(char),stdin);// 通过外设输入(键盘)
fputs(strcat(name,"快跑!"),stdout);// 输出数据到外设(显示器)
//puts(strcat(name,"快跑!"));// 输出数据到外设(显示器)
// fputs(strcat("你好",name),stdout);// 输出数据到外设(显示器)
return 0;
}
注意:
① 字符串1 必须是字符数组,的长度必须足够大,以便于能够容纳被链接的字符串。
② 连接后系统将自动取消 字符串1 后面的结束符 \0
③ 字符串2 可以是字符数组名,也可以是字符串常量,如:strcat(s1,“def”); strcat(s1,s2);
字符串拷贝
- 语法:strcpy(数组名,字符串)
- 引入:string.h
- 说明:这个函数适合给字符串赋值
char str[20] = "坤坤"; //正确
char str[20]; str = "鸡哥";//错误
char str[20]; strcpy(str,"ikun");//正确
- 案例:
/*************************************************************************
> File Name: demo02.c
> Author: FPF
> Description: 字符串拷贝
> Created Time: 2025年02月18日 星期二 09时55分07秒
************************************************************************/
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
char name[20];
printf("请输入您的名字:\n");
fgets(name,sizeof(name)/sizeof(char),stdin);
// 重新赋值
strcpy(name,"孙成龙");
printf("同学的名字叫%s\n",name);
return 0;
}
字符串比较
- 语法: strcmp(字符串1,字符串2) 字符串可以是常量,也可以是字符数组
- 引入: string.h
- 功能:比较两个字符串对应的位置字符ASCII的大小(字典顺序比较)
- 返回值:
- 若字符串1 等于 字符串2,返回0
- 若字符串1 大于 字符串2,返回正数(>0)
- 若字符串1 小于 字符串2,返回负数(<0)
- 说明:
① 执行这个函数时,自左到右逐个比较对应字符的ASCII的值,直到发现了不同字符或字符串结
束符’\0’为止。
② 对字符串不能用数值型比较符。比如:“abc” == “abc”,这种比较是错误的
③ 字符串1与字符串2可以是字符数组,也可以是字符串常量。
- 案例:
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[])
{
// 创建两个数组,用来存放用户和帐号
char username[20],password[8];
printf("登录");
printf("请输入您的账户:\n");
scanf("%s",username);
printf("请输入您的密码:\n");
scanf("%s",password);
// 校验
if(!strcmp(username,"admin") && !strcmp(password,"123456"))
{
printf("登录成功!\n");
}
else
{
printf("账户或者密码错误!\n");
}
return 0;
}
字符串长度
- 语法:
strlen(字符串)
- 引用:
string.h
- 注意:返回字符串中包含的字符的实际个数,不含
\0
- 案例:
/*************************************************************************
> File Name: demo04.c
> Author: FPF
> Description: 字符串长度
> Created Time: 2025年02月18日 星期二 10时27分18秒
************************************************************************/
#include <stdio.h>
#include <string.h>
void test01()
{
char username[20];
printf("请输入您的账户:\n");
scanf("%s",username);
// 获取字符串长度
unsigned long len = strlen(username); // 排除\0 hello\0,he\0llo\0
if(!strcmp(username,"admin"))
{
printf("账户输入正确!%lu\n",len);
}
else
{
printf("账户输入错误!%lu\n",len);
}
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
案例1
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。I LOVE YOU
分析:采用通过空格统计单词的方法。具体是:
① 用连续若干个空格算一个、一行开头的空格不计的方法决定单词数目;
② 从第一个字符开始逐个检查字符串中的每一个字符。若查到某一字符非空格,而其前面的字符是空格,则表示新单词开始,让计数变量num++。否则,当前字符非空格,前面字符也非空格,则非新单词,num不变;
③ 用变量word=0或1来表示前面字符是空格或不是空格。则:
代码:
#include <stdio.h>
void main()
{
char string[81];
int i,num=0,word=0;// num:计数,word:单词个数校验
char c;
fgets(string,81,stdin); /*从键盘输入一个字符串,I LOVE YOU*/
for (i=0;(c=string[i])!='\0';i++) /*从第一个字符开始判断是否串尾*/
{
if(c==' ') word=0; /*如不是串尾,若是空格 I LOVE YOU*/
else if(word==0) /*如不是串尾、不是空格,而前一字符是空格*/
{
word=1;
num++;
} /*是新单词,计数*/
}
printf("There are %d words in this line.\n",num);
}
案例2
有三个字符串,要求找出其中最大者。
分析:设计一个二维字符数组str3,即3行20列。
① 可把str[0]、str[1]、str[2]看作3个一维字符数组,各有20个元素;
② 用gets函数分别输入3个字符串到str[0]、str[1]、str[2]中 ;
③ 用字符串函数对str[0]、str[1]、str[2]进行比较,得到最大者。
总结
- 数组是有序数据的集合。数组中的所有元素都必须是同类型的。用一个统一的名字和下标来唯一的确定元素在数组中的位置。在程序中把循环和数组结合起来,对数组元素进行操作,可有效地处理大批量的数据,提高工作效率。
- 正确定义数组。注意:元素的下标默认从0开始、防止下标越界。
- 注意数组的定义形式和数组元素的引用形式的本质区别。
- 二维数组元素在内存中按行存储。初始化时,按行赋值。
- C语言中无字符串变量,字符串是以字符数组形式存放的。系统在每个串尾自动加一个串结束符‘\0’,但‘\0’不是字符串的组成部分。将含n个字符的串存入数组中时,数组长度应≥n+1。
- 字符串的运算要用字符串函数进行,要包含“string.h”头文件。
- 由基本类型的数据按一定规则构成的数据称为构造类型数据。