1.字符串输入函数
scanf("%s",数组名);
gets(数组名);
区别:
scanf(“%s”,数组名); 把空格识别为输入结束
#include <stdio.h>
int main()
{
char a[10];
printf("输入:");
scanf("%s",a);
//gets(a);
printf("输出:%s\n",a);
return 0;
}
gets(数组名); 可以识别空格字符到数组中
#include <stdio.h>
int main()
{
char a[10];
printf("输入:");
//scanf("%s",a);
gets(a);
printf("输出:%s\n",a);
return 0;
}
2.字符串输出函数
printf(“xxxx%s”,数组名);
puts(数组名);
区别:
printf可以放描述语
puts函数自动加换行符
3.计算字符串有效长度函数
计算字符串长度可以使用标准库中的 strlen
函数。这个函数位于 <string.h>
头文件中。
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "Hello, World!";
size_t length = strlen(str); // 计算字符串长度
printf("Length of the string is: %zu\n", length);
return 0;
}
sizeof 和 strlen 的区别?
sizeof:
属性 :是一个关键字
使用格式: int val = sizeof(变量名); 可以用于变量,数组
功能 :计算占用字节空间大小的
strlen:
属性 :是一个函数
使用格式: int val = strlen(数组名) ;只能用于数组(字符串)
功能 :计算字符串的有效长度
练习1:
char a[10] = “qwert”;
sizeof(a) //10byte
strlen(a) //5
练习2:
char a[] = “qwert”;
sizeof(a) //6byte
strlen(a) //5
练习:自己写一个。
要求:
用户在主函数中输入一个字符串,
写一个子函数,子函数功能是接到主函数的字符串计算长度,并且返回具体长度值.
主函数调用子函数通过接收返回值来打印字符串的长度.
#include <stdio.h>
int my_strlen(char *str);
int main()
{
char a[20];
int len;
printf("请输入一个字符串:\n");
scanf("%s",a);
len = my_strlen(a);
printf("输入的字符串的长度为:%d",len);
return 0;
}
/*******************************************************
函数名 :my_strlen
函数功能 :计数字符串的有效长度
函数参数 :char *str
函数返回值 :int
函数描述 :
*******************************************************/
int my_strlen(char *str)
{
int cont = 0;
int i = 0;
while(*(str+i) != '\0')
{
cont++;
i++;
}
return cont;
}
4.字符串复制函数
复制字符串可以使用标准库中的 strcpy
函数。这个函数位于 <string.h>
头文件中。
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[50]; // 确保目标数组足够大
strcpy(dest, src); // 复制字符串
printf("Source String: %s\n", src);
printf("Destination String: %s\n", dest);
return 0;
}
练习:自己写一个。
要求:
用户输入两个字符串str1 和 str2
要求写一个子函数将str2复制给str1
打印复制后的str1
char str1[] = “123456”;
char str2[] = “abcdef“;
复制后:str1 : “abcdef“
#include <stdio.h>
void my_strcpy(char *dest,char *src);
int main()
{
char str1[50],str2[50];
printf("请输入str1:");
scanf("%s",str1);
printf("请输入str2:");
scanf("%s",str2);
my_strcpy(str1,str2);
printf("复制后的str1:%s",str1);
return 0;
}
/*******************************************************
函数名 :my_strcpy
函数功能 :复制字符串
函数参数 :char *dest char *src
函数返回值 :无
函数描述 :函数会将字符串src复制给dest
*******************************************************/
void my_strcpy(char *dest,char *src)
{
int i = 0;
while(*(src+i) != '\0')
{
*(dest+i) = *(src+i);
i++;
}
*(dest+i) = '\0'; //这句非常重要,否则当str1和str2长度不一致时会出现bug
}
假如没有加这一句:
*(dest+i) = '\0';
当str2长, str1短, 复制后str1会出现乱码,因为结束字符被覆盖了;(有些编译器在执行时会优化,不会出现乱码)
当str1长, str2短, 复制后str1会没有完全被覆盖;
可以注释掉这一句看看会发生什么。
5.字符串拼接函数
字符串拼接可以使用标准库中的 strcat
函数。这个函数位于 <string.h>
头文件中。
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, "; // 目标字符串,留出足够空间
char src[] = "World!";
// 使用 strcat 函数拼接字符串
strcat(dest, src);
printf("Concatenated String: %s\n", dest);
return 0;
}
练习:自己写一个。
要求:
用户主函数中输入两个字符串str1和str2
写一个子函数实现将str2拼接到str1后面
str1:1234
str2:abcd
拼接后:str1:1234abcd
#include <stdio.h>
void my_strcat(char *dest,char *src);
int main()
{
char str1[50],str2[50];
printf("请输入str1:");
scanf("%s",str1);
printf("请输入str2:");
scanf("%s",str2);
my_strcat(str1,str2);
printf("拼接后的str1:%s",str1);
return 0;
}
/*******************************************************
函数名 :my_strcat
函数功能 :拼接字符串
函数参数 :char *dest char *src
函数返回值 :无
函数描述 :函数会将字符串src拼接在dest后
*******************************************************/
void my_strcat(char *dest,char *src)
{
int i = 0,j = 0;
while(*(dest+i) != '\0')
{
i++;
}
while(*(src+j) != '\0')
{
*(dest+i) = *(src+j);
i++;
j++;
}
*(dest+i) = '\0';
}
6.字符串比较函数
字符串比较可以使用标准库中的 strcmp
函数。这个函数位于 <string.h>
头文件中。
#include <stdio.h>
#include <string.h>
int main() {
char str1[50], str2[50];
printf("请输入第一个字符串: ");
scanf("%s", str1);
printf("请输入第二个字符串: ");
scanf("%s", str2);
int result = strcmp(str1, str2);
if (result == 0) {
printf("两个字符串相同。\n");
} else if (result < 0) {
printf("第一个字符串小于第二个字符串。\n");
} else {
printf("第一个字符串大于第二个字符串。\n");
}
return 0;
}
(库函数是从头开始逐个比较,只要出现不同的字符就立马返回结果)
练习:自己写一个。
要求:
用户在主函数输入两个字符串,str1和str2,
在子函数中判断连个字符串是否相等,(长度要相等,对应字符一样)
相等返回0,不相等返回1;
(和库函数不太一样)
#include <stdio.h>
int my_strcmp(char *str1,char *str2);
int main()
{
char str1[50],str2[50];
int judge;
printf("请输入str1:");
scanf("%s",str1);
printf("请输入str2:");
scanf("%s",str2);
judge = my_strcmp(str1,str2);
if(judge == 0)
{
printf("字符串str1和字符串str2相同。");
}
else if(judge == 1)
{
printf("字符串str1和字符串str2不相同。");
}
return 0;
}
/*******************************************************
函数名 :my_strcmp
函数功能 :比较字符串
函数参数 :char *str1 char *str2
函数返回值 :int
函数描述 :比较字符串str1和字符串str2,如果相同则返回0,
不相同则返回1.(长度和内容都相同)
*******************************************************/
int my_strcmp(char *str1, char *str2)
{
// 定义循环索引变量
int i = 0, j = 0, k = 0;
// 遍历第一个字符串,找到结束符'\0'的位置
while (*(str1 + i) != '\0')
{
i++; // 递增索引
}
// 遍历第二个字符串,找到结束符'\0'的位置
while (*(str2 + j) != '\0')
{
j++; // 递增索引
}
// 如果两个字符串的长度相同
if (i == j)
{
// 比较两个字符串的每一个字符
while (*(str1 + k) != '\0')
{
// 如果某一位置的字符不同,返回1表示不相同
if (*(str1 + k) != *(str2 + k))
{
return 1; // 字符不同,返回1
}
k++; // 继续比较下一个字符
}
return 0; // 所有字符都相同,返回0
}
else // 如果两个字符串的长度不同
{
return 1; // 长度不同,返回1
}
}
也可以这样写,这样比较像库函数的写法。
#include <stdio.h>
int my_strcmp(char *str1, char *str2);
int main()
{
char str1[50], str2[50];
int judge;
printf("请输入str1: ");
scanf("%s", str1);
printf("请输入str2: ");
scanf("%s", str2);
judge = my_strcmp(str1, str2);
if(judge == 0)
{
printf("字符串str1和字符串str2相同。\n");
}
else
{
printf("字符串str1和字符串str2不相同。\n");
}
return 0;
}
/*******************************************************
函数名 : my_strcmp
函数功能 : 比较字符串
函数参数 : char *str1, char *str2
函数返回值 : int
函数描述 : 比较字符串str1和字符串str2,如果相同则返回0,
不相同则返回1。(长度和内容都相同)
*******************************************************/
int my_strcmp(char *str1, char *str2)
{
while (*str1 != '\0' && *str2 != '\0') // 同时遍历两个字符串
{
if (*str1 != *str2) // 如果字符不相同,返回1
{
return 1;
}
str1++;
str2++;
}
// 如果两个字符串长度不同,直接返回1
if (*str1 != *str2)
{
return 1;
}
// 如果完全遍历过后两个字符串都相同,返回0
return 0;
}
这是库函数的写法:
int my_strcmp( char *str1, char *str2) {
while (*str1 != '\0' && *str2 != '\0') {
if (*str1 != *str2) {
return *str1 - *str2; // 返回字符差值
}
str1++;
str2++;
}
// 如果字符串都已结束,则比较长度
return *str1 - *str2;
}
一些小题目练练手
1.编写程序,将用户输入的字符串中的所有的字符a用*代替,然后输出。
分析:
通过循环结构遍历每个字符并且判断是否为子符a,
如果是字符a,用*字符替换此元素
循环的条件 用户输入的字符串不是'\0'
2.输入一串字符,把其中的大写字母变成小写字母并输出
分析:
用户输入一个字符串,
通过循环结构遍历每个字符,
判断如果某个字符是大写的就把此元素替换为对应的字符小写
循环条件是 '\0'
3.写一函数判断一字符串是否为回文,是返回1,不是返回0,
"123321"
"12321"
"asdffdsa"
"asdfdsa"
分析:
用第一个 与最后一个比较 ,以此类推, 如果出现不相等的就不是回文
循环结构正常结束,就是回文。
1.
#include <stdio.h>
int main()
{
char a[100];
int i = 0;
printf("请输入字符串:");
scanf("%s",a);
while(a[i] != '\0')
{
if(a[i] == 'a')
{
a[i] = '*';
}
i++;
}
printf("已经将所以'a'替换成了‘*’\n替换后的字符串为:%s",a);
return 0;
}
2.
#include <stdio.h>
int main()
{
char a[100];
int i = 0;
printf("请输入字符串:");
scanf("%s",a);
while(a[i] != '\0')
{
if(a[i] >= 'A'&& a[i] <='Z')
{
a[i] += 32;
}
i++;
}
printf("已经将所以大写字母替换成对应的小写字母\n替换后的字符串为:%s",a);
return 0;
}
3.
#include <stdio.h>
#include <string.h>
int pal(char *str);
int main()
{
char a[100];
int judge;
printf("请输入字符串:");
scanf("%s",a);
judge = pal(a);
if(judge == 1)
{
printf("是回文");
}
else if(judge == 0)
{
printf("不是回文");
}
return 0;
}
int pal(char *str)
{
int len = strlen(str);
for(int i = 0 ;i < len/2;i++)
{
if(*(str+i) != *(str+len-1-i))
{
return 0;
}
}
return 1;
}