2、一些变量名含义:
1、puts函数:
puts("请输入一个字符串");
2、printf函数:
char *str = "abcde";
printf("%s", str);
3、sprintf函数:
#include
int main(int argc, char const *argv[])
{
char str[10];
sprintf(str, "%d:%d:%d", 2023, 3, 29);
puts(str);
return 0;
}
0、知识点:
1、gets:
#include
int main(int argc, char const *argv[])
{
char str[10] = {'\0'};
printf("请输入字符串(长度在9以内)\n");
gets(str);
printf("%s\n", str);
return 0;
}
2、scanf函数:
#include
int main(int argc, char const *argv[])
{
char str[10] = {'\0'};
printf("请输入字符串(长度在9以内)\n");
scanf("%9s", str);
printf("%s\n", str);
return 0;
}
3、sscanf函数:
#include
int main(int argc, char const *argv[])
{
char str1[20], str2[20];
sscanf("abcd 1234", "%s %s", str1, str2);
printf("str1=%s, str2=%s\n", str1, str2);
int year, month, day;
sscanf("2023:3:29", "%d:%d:%d", &year, &month, &day);
printf("year=%d,month=%d,day=%d", year, month, day);
return 0;
}
4、scanf和sscanf的高级用法:先看以下知识点,然后再看习题1,巩固sscanf用法。
#include
int main(int argc, char const *argv[])
{
char str[20] = {'\0'};
sscanf("1234 5678", "%*d%s", str); //%*d表示读取到一个整型数据但是跳过他
printf("str = %s\n", str);
puts("请输入");
scanf("%*d%s", str); //%*d表示读取到一个整型数据但是跳过他
printf("str = %s\n", str);
return 0;
}
#include
int main(int argc, char const *argv[])
{
char str[20] = {'\0'};
sscanf("abcdeABCDE,1234FGH", "%[a-zA-Z]", str); //只要字母
puts(str);
printf("请输入字符串\n");
scanf("%[a-zA-Z]", str); //只要字母
puts(str);
return 0;
}
#include
int main(int argc, char const *argv[])
{
char str[20] = {'\0'};
sscanf("ABCDE1234abcde", "%[^a-z0-9]", str); //就不要小写字母和数字
puts(str);
printf("请输入字符串\n");
scanf("%[^a-z0-9]", str);
puts(str);
return 0;
}
5、输入字符串时允许有多个空格的方法:
#include
int main(int argc, char const *argv[])
{
char str[20] = {'\0'};
char str1[20] = {'\0'};
printf("请输入字符串\n");
scanf("%[^\n]", str); //规定以回车符作为字符串读取的结束标志
puts(str);
getchar(); //加getchar()来接收回车符
printf("请输入字符串\n");
scanf("%[^\n]", str1); //规定以回车符作为字符串读取的结束标志
puts(str1);
return 0;
}
#include
int main(int argc, char const *argv[])
{
char str[20] = {'\0'};
char str1[20] = {'\0'};
sscanf("hello world\n", "%[^\n]%*c", str); //规定以回车符作为字符串读取的结束标志,同时跳过最后一个回车符
puts(str);
sscanf("day day up\n", "%[^\n]%*c", str1); //规定以回车符作为字符串读取的结束标志,同时跳过最后一个回车符
puts(str1);
return 0;
}
1、strlen函数:练习习题2,自己实现strlen()函数(嵌入式笔试)
#include
#include
int main(int argc, char const *argv[])
{
char str[20] = "abcde";
size_t len;
len = strlen(str);
printf("%s的有效长度:%d\n", str, len);
return 0;
}
0、知识点:
1、strcpy函数:练习 习题3,自己实现strcpy()函数(嵌入式笔试)
#include
#include
int main(int argc, char const *argv[])
{
char str[20] = "1234567890123456789";
char *src = "abcde";
printf("拷贝前:%s\n", str);
strcpy(str, src);
printf("拷贝后:%s\n", str);
printf("拷贝后没被修改的部分:%s", str+6);
return 0;
}
2、strncpy函数: 练习 习题4,自己实现strncpy()函数(嵌入式笔试)
#include
#include
int main(int argc, char const *argv[])
{
char str[20] = "1234567890123456789";
char *src = "abcde";
printf("拷贝前:%s\n", str);
strncpy(str, src, 2);
printf("拷贝前2个字节后:%s\n", str);
return 0;
}
1、assert宏定义:
#include
#include
char* my_strncpy(char *dest, const char *src, int count);
int main(int argc, char const *argv[])
{
char str[20] = "1234567890123456789";
printf("拷贝前:%s\n", str);
my_strncpy(str, NULL, 2); //这里不妨做个测试,看看assert都打印了什么
printf("拷贝前2个字节后:%s\n", str);
return 0;
}
char* my_strncpy(char *dest, const char *src, int count)
{
assert(dest!=NULL && src!=NULL);
}
习题1:【从已知字符串中获取其中两个字符中间的内容】现有字符串"account:#[email protected]",试获取#和@符号之间的字符串123456789。
1. 使用sscanf从字符串"account:#[email protected]"中以如下规则获取字符串输入到字符数组str中:
规则 1.1: 就不要符号'#'之前的内容, 同时将这部分字符给跳过,这里有点特别相当于%*s: %*[^#]
规则 1.2: 把符号'#'作为原样输入,也可以把'#'写成"%*#"
规则 1.3: 以符号'@'作为读取结束标志
综合以上规则,可以写出sscanf的format部分:"%*[^#]#%[^@]" 或者 "%*[^#]%*#%[^@]"
2. 打印str,进行验证
#include
int main(int argc, char const *argv[])
{
char str[20] = {'\0'};
char *p = "account:#[email protected]";
sscanf(p, "%*[^#]#%[^@]", str);
printf("str=%s\n", str);
return 0;
}
习题2:试着实现strlen的函数功能
f1. 封装实现strlen函数功能的API: size_t my_strlen(cosnt char *str);
f1.1 while循环,控制循环的变量是*str,也就是字符串str中的某个字符,当*str!='\0' 时,进入循环
f1.1.1 偏移字符指针str的指向: str++;
f1.1.2 修改代表有效字符长度的变量len: len++; //记得初始化len=0;
1. 初始化或者输入一个字符串,可以放在栈区、堆区、常量区,比如: char str[20] = "helloworld";
2. 调用API1. 获取字符串str的有效长度,保存变量len中: len = my_strlen(str);
3. 打印len
#include
size_t my_strlen(const char *str);
int main(int argc, char const *argv[])
{
char str[20] = "helloworld";
size_t len;
len = my_strlen(str);
printf("%s的有效长度:%d\n", str, len);
return 0;
}
size_t my_strlen(const char *str)
{
size_t len = 0;
while (*str != '\0'){
str++;
len++;
}
return len;
}
习题3:试着实现strcpy的函数功能
f1. 封装实现strcpy函数功能的API: char* my_strcpy(char *dest, const char *src);
f1.1 判断指针dest或者指针src的值是否是NULL
f1.1.1 如果是,
那么,代表函数执行失败,提前结束函数调用,返回NULL
f1.2 定义一个备份指针ptr指向dest所指内容
f1.3 while循环,控制循环的变量是*str,也就是字符串str中的某个字符,当*str!='\0' 时,进入循环
f1.3.1 通过指针间接改变dest字符数组中的字符,将src中的字符复制到dest对应位置:
*dest = *src;
f1.3.2 偏移字符指针str的指向: str++;
f1.3.3 偏移字符指针dest的指向: dest++;
f1.4 通过指针间接修改,令拷贝过来的最后一位是空字符'\0': *dest = '\0';
f1.5 返回ptr的值
1. 初始化或者输入一个字符串,只可以放在栈区、堆区,比如: char str[20] = "1234567890123456789";
2. 调用API1. 将某个字符串拷贝到str中,比如: my_strcpy(str, "abcde");
3. 打印拷贝前后的字符串
#include
char* my_strcpy(char *dest, const char *src);
int main(int argc, char const *argv[])
{
char str[20] = "1234567890123456789";
printf("拷贝前:%s\n", str);
my_strcpy(str, "abcde");
printf("拷贝后:%s\n", str);
printf("拷贝后没被修改的部分:%s", str+6);
return 0;
}
char* my_strcpy(char *dest, const char *src)
{
if(dest==NULL || src==NULL){
return NULL;
}
char *ptr = dest;
while (*src != '\0'){
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return ptr;
}
习题4:试着实现strncpy的函数功能
f1. 封装实现strncpy函数功能的API: char* my_strncpy(char *dest, const char *src, int count);
f1.1 判断指针dest或者指针src的值是否是NULL
f1.1.1 如果是,
那么,代表函数执行失败,提前结束函数调用,返回NULL
f1.2 定义一个备份指针ptr指向dest所指内容
f1.3 while循环,控制循环的变量是*str以及count,当*str!='\0' 并且 count>0 时,进入循环
//内在逻辑:不妨先假设count0先不满足
f1.3.1 通过指针间接改变dest字符数组中的字符,将src中的字符复制到dest对应位置:
*dest = *src;
f1.3.2 偏移字符指针str的指向: str++;
f1.3.3 偏移字符指针dest的指向: dest++;
f1.3.4 修改循环变量count: count--;
f1.4 判断count是否大于0
//内在逻辑:条件*src!='\0'先不满足,说明count>src所指字符串长度,那么让多余的部分用'\0'填充
f1.4.1 while循环,循环变量count,当count>0 时,进入循环
f1.4.1.1 通过指针间接修改: *dest = '\0';
f1.4.1.2 偏移字符指针dest的指向: dest++;
f1.4.1.3 修改循环变量count: count--;
f1.5 返回ptr的值
1. 初始化或者输入一个字符串,只可以放在栈区、堆区,比如: char str[20] = "1234567890123456789";
2. 调用API1. 将某个字符串的前几位拷贝到str中,比如: my_strcpy(str, "abcde", 2);
3. 打印拷贝前后的字符串
#include
char* my_strncpy(char *dest, const char *src, int count);
int main(int argc, char const *argv[])
{
char str[20] = "1234567890123456789";
char *src = "abcde";
printf("拷贝前:%s\n", str);
my_strncpy(str, src, 2);
printf("拷贝前2个字节后:%s\n", str);
return 0;
}
char* my_strncpy(char *dest, const char *src, int count)
{
if(dest==NULL || src==NULL){
return NULL;
}
char *ptr = dest;
while (count>0 && *src!='\0'){ //当count0先不满足
*dest = *src;
dest++;
src++;
count--;
}
if(count > 0){ //如果说条件*src!='\0'先不满足,说明count>src所指字符串长度
while(count > 0){
*dest = '\0';
dest++;
count--;
}
}
return ptr;
}