一、字符串复制
在字符串操作中,字符串复制是比较常用的操作之一,在字符串处理函数中包含strcpy函数,该函数可用于复制特定长度的字符串到另一个字符串中。其语法格式如下:
strcpy(目的字符数组名,源字符数组名)
功能:把源字符数组中的字符串复制到目的字符数组中。字符串结束标志“\0”也一同复制。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[30],str2[30];
printf("输入目的字符串:\n");
gets(str1); /*输入目的字符*/
printf("输入源字符串:\n");
gets(str2); /*输入源字符串*/
printf("输出目的字符串:\n");
puts(str1); /*输出目的字符*/
printf("输出源字符串:\n");
puts(str2); /*输出源字符串*/
strcpy(str1,str2); /*调用strcpy函数实现字符串复制*/
printf("调用strcpy函数进行字符串复制:\n");
printf("复制字符串之后的目的字符串:\n");
puts(str1); /*输出复制后的目的字符串*/
return 0; /*程序结束*/
}
二、字符串连接
字符串连接就是将一个字符串连接到另一个字符串的末尾,使其组合成一个新的字符串。在字符串处理函数中,strcat函数就具有字符串连接的功能。其语法格式如下:
strcat(目的字符数组名,源字符数组名)
功能:把源字符数组中的字符串连接到目的字符数组中字符串的后面,并删去目的字符数组中原有的串结束标志“\0”。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[30],str2[30];
printf("输入目的字符串:\n");
gets(str1); /*输入目的字符*/
printf("输入源字符串:\n");
gets(str2); /*输入源字符串*/
printf("输出目的字符串:\n");
puts(str1); /*输出目的字符*/
printf("输出源字符串:\n");
puts(str2); /*输出源字符串*/
strcat(str1,str2); /*调用strcat函数进行字符串连接*/
printf("调用strcat函数进行字符串连接:\n");
printf("字符串连接之后的目的字符串:\n");
puts(str1); /*输出连接后的目的字符串*/
return 0; /*程序结束*/
}
三、字符串比较
字符串比较就是将一个字符串与另一个字符串从首字母开始,按照ASCII码的顺序进行逐个比较。在字符串处理函数中,strcmp函数就具有在字符串间进行比较的功能。其语法格式如下:
strcmp(字符数组名1,字符数组名2)
功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
返回值如下:
字符串1=字符串2,返回值为0。
字符串1>字符串2,返回值为正数。
字符串1<字符串2,返回值为负数。
#include<stdio.h>
#include<string.h>
int main()
{
char user[20] = {"mrsoft"};
char password[20] = {"mrkj"};
char ustr[20],pwstr[20];
int i=0;
while(i < 3)
{
printf("输入用户名字符串:\n");
gets(ustr); /*输入用户名字符串*/
printf("输入密码字符串:\n");
gets(pwstr); /*输入密码字符串*/
if(strcmp(user,ustr)) /*如果用户名字符串不相等*/
{
printf("用户名字符串输入错误!\n"); /*提示用户名字符串输入错误*/
}
else /*用户名字符串相等*/
{
if(strcmp(password,pwstr)) /*如果密码字符串不相等*/
{
printf("密码字符串输入错误!\n"); /*提示密码字符串输入错误*/
}
else /*用户名和密码字符串都正确*/
{
printf("欢迎使用!\n"); /*输出欢迎字符串*/
break;
}
}
i++;
}
if(i == 3)
{
printf("输入字符串错误3次!\n"); /*输入字符串错误3次*/
}
return 0; /*程序结束*/
}
四、字符串大小写转换
字符串的大小写转换需要使用strupr函数和strlwr函数。strupr函数的语法格式如下:
strupr(字符串)
功能:将字符串中的小写字母变成大写字母,其他字母不变。
strlwr函数的语法格式如下:
strlwr(字符串)
功能:将字符串中的大写字母变成小写字母,其他字母不变。
#include<stdio.h>
#include<string.h>
int main()
{
char text[20],change[20];
int num;
int i=0;
while(1)
{
printf("输入转换大小写方式(1表示大写,2表示小写,0表示退出):\n");
scanf("%d", &num);
if(num == 1) /*如果是转换为大写*/
{
printf("输入一个字符串:\n");
scanf("%s", &text); /*输入要转换的字符串*/
strcpy(change,text); /*拷贝要转换的字符串*/
strupr(change); /*字符串转换大写*/
printf("转换成大写字母的字符串为:%s\n",change); /*输出转换后的字符串*/
}
else if(num == 2) /*如果是转换为小写*/
{
printf("输入一个字符串:\n");
scanf("%s", &text); /*输入要转换的字符串*/
strcpy(change,text); /*拷贝要转换的字符串*/
strlwr(change); /*字符串转换小写*/
printf("转换成小写字母的字符串为:%s\n",change); /*输出转换后的字符串*/
}
else if(num == 0) /*如果命令字符为0*/
{
break; /*跳出当前循环*/
}
}
return 0; /*程序结束*/
}
五、获得字符串长度
在使用字符串的时候,有时需要动态获得字符串的长度,通过循环来判断字符串结束标志“\0”虽然也能获得字符串的长度,但是实现起来相对繁琐。这时,可以使用strlen函数来计算字符串的长度。strlen函数的语法格式如下:
strlen(字符数组名)
功能:计算字符串的实际长度(不含字符串结束标志“\0”),函数返回值为字符串的实际长度。
#include<stdio.h>
#include<string.h>
int main()
{
char text[50],connect[50];
int num;
printf("输入一个字符串:\n");
scanf("%s", &text); /*获取输入的字符串*/
num = strlen(text); /*计算字符串长度*/
printf("字符串的长度为:%d\n",num); /*输出字符串长度*/
printf("再输入一个字符串:\n");
scanf("%s", &connect); /*获取输入的字符串*/
num = strlen(connect); /*计算字符串长度*/
printf("字符串的长度为:%d\n",num); /*输出字符串长度*/
strcat(text,connect); /*连接字符串*/
printf("将两个字符串进行连接:%s\n",text); /*输出连接后的字符串*/
num = strlen(text); /*计算连接后的字符串长度*/
printf("连接后的字符串长度为:%d\n",num); /*输出连接后的字符串*/
return 0; /*程序结束*/
}
六、数 组 应 用
反转输出字符串
字符串操作在应用程序中经常会使用,如连接两个字符串、查找字符串等。本节需要实现的功能是反转字符串。以字符串“mrsoft”为例,其反转的结果为“tfosrm”。
在程序中定义两个字符数组,一个表示源字符串,另一个表示反转后的字符串。在源字符串中我们从第一个字符开始遍历,读取字符数据,在目标字符串中从最后一个字符(结束标记\0 除外)倒序遍历字符串,依次将源字符串中的第一个字符数据写入目标字符串的最后一个字符中,将源字符串中的第2个字符数据写入目标字符串的倒数第2个字符中,依此类推。这样就实现了字符串的反转。图8.23描述了算法的实现过程。
#include <stdio.h>
int main()
{
int i;
char String[7] = {"mrsoft"};
char Reverse[7] = {0};
int size;
size = sizeof(String); /*计算源字符串长度*/
/*循环读取字符*/
for(i=0;i<6;i++)
{
Reverse[size-i-2] = String[i];/*向目标字符串中插入字符*/
}
/*输出源字符串*/
printf("输出源字符串:%s\n",String);
/*输出目标字符串*/
printf("输出目标字符串:%s\n",Reverse);
return 0; /*程序结束*/
}
输出系统日期和时间
在控制台应用程序中,通常需要按照系统的提示信息进行操作。例如,用户进行某一个操作,需要输入一个命令,如果命令输入错误,系统会进行提示。本节要求设计一个应用程序,当用户输入命令字符“0”时显示帮助信息,输入命令字符“1”时显示系统日期,输入命令字符“2”时显示系统时间,输入命令字符“3”时退出系统。
在设计本实例时需要解决两个问题:第一个问题是需要不断地保持程序运行,等待用户输入命令,防止main函数结束;第二个问题是获取系统日期和时间。
对于第一个问题可以使用一个无限循环语句来实现,在循环语句中等待用户输入,如果用户输入了命令字符3,则终止循环,结束应用程序。
对于第2个问题可以使用时间函数time和localtime来获取系统日期和时间。
#include <stdio.h>
#include <time.h>
int main()
{
int command[4] = {0,1,2,3}; /*定义一个数组*/
int num;
struct tm *sysTime;
printf("如需帮助可输入数字0!\n"); /*输出字符串*/
printf("请输入命令符:\n"); /*输出字符串*/
while (1)
{
scanf("%d", &num); /*获得输入数字*/
/*判断用于输入的字符*/
if (command[0] == num) /*如果输入数字0 */
{
/*输出帮助信息*/
printf("输入数字1显示系统日期, 输入数字2显示系统时间, 输出字母3退出系统!\n");
}
else if (command[1] == num) /*如果是命令数字1*/
{
time_t nowTime;
time(&nowTime); /*获取系统日期*/
sysTime= localtime(&nowTime); /*转换为系统日期*/
printf("系统日期:%d-%d-%d \n",1900 + sysTime->tm_year,sysTime->tm_mon + 1
,sysTime->tm_mday); /*输出信息*/
}
else if (command[2] == num) //如果是命令数字2*/
{
time_t nowTime;
time(&nowTime); /*获取系统时间*/
sysTime = localtime(&nowTime); /*转换为系统时间*/
printf("系统时间:%d:%d:%d \n",sysTime->tm_hour ,sysTime->tm_min
,sysTime->tm_sec); /*输出信息*/
}
else if (command[3] == num)
{
return 0; /*退出系统*/
}
printf("请输入命令符:\n"); /*输出字符串*/
}
return 0; /*程序结束*/
}
字符串的加密和解密
在设计应用程序时,为了防止一些敏感信息的泄漏,通常需要对这些信息进行加密。以用户的登录密码为例,如果密码以明文的形式存储在数据表中,就很容易被人发现;相反,如果密码以密文的形式储存,即使别人从数据表中发现了密码,这也是加密之后的密码,根本不能够使用。通过对密码进行加密,能够极大提高系统的保密性。
为了减小本节实例的规模,这里要求设计一个加密和解密的算法,在对一个指定的字符串加密之后,利用解密函数能够对密文解密,显示明文信息。加密的方式是将字符串中每个字符加上它在字符串中的位置和一个偏移值5。以字符串"mrsoft"为例,第一个字符m在字符串中的位置为0,那么它对应的密文是’m’ + 0 + 5,即r。
#include <stdio.h>
#include<string.h>
int main()
{
int result = 1;
int i;
int count = 0;
char Text[128] = {'\0'}; /*定义一个明文字符数组*/
char cryptograph[128] = {'\0'}; /*定义一个密文字符数组*/
while (1)
{
if (result == 1) /*如果是加密明文*/
{
printf("请输入要加密的明文:\n"); /*输出字符串*/
scanf("%s", &Text); /*获取输入的明文*/
count = strlen(Text);
for(i=0; i<count; i++) /*遍历明文*/
{
cryptograph[i] = Text[i] + i + 5; /*设置加密字符*/
}
cryptograph[i] = '\0'; /*设置字符串结束标记*/
/*输出密文信息*/
printf("加密后的密文是:%s\n",cryptograph);
}
else if(result == 2) /*如果是解密字符串*/
{
count = strlen(Text);
for(i=0; i<count; i++) /*遍历密文字符串*/
{
Text[i] = cryptograph[i] - i - 5; /*设置解密字符*/
}
Text[i] = '\0'; /*设置字符串结束标记*/
/*输出明文信息*/
printf("解密后的明文是:%s\n",Text);
}
else if(result == 3) /*如果是退出系统*/
{
break; /*跳出循环*/
}
else
{
printf("请输入正确命令符:\n"); /*输出字符串*/
}
/*输出字符串*/
printf("输入1加密新的明文,输入2对刚加密的密文进行解密,输入3退出系统:\n");
printf("请输入命令符:\n"); /*输出字符串*/
scanf("%d", &result); /*获取输入的命令字符*/
}
return 0; /*程序结束*/
}