字符串基本概念
int main(int argc, const char * argv[]) {
/*
// 用双引号引起来的就是字符串
printf("Hello, World!\n");
// 字符串是由什么组成的? 字符"串" , 羊肉"串"
// 如何定义字符串变量, 由于字符串是同一种类型的数据组成, 并且是有序的\
而数组就是用于存储很多同一种类型的有序数据, 所以可以使用数组来保存字符串
// 注意: 字符串变量和普通的字符数组有一定的区别
// C语言规定, 字符串必须以\0结尾(作为字符串的结束符号), 所以字符串变量的元素个数比字符数组的元素个数多一个 \0
char str[] = "lnj"; // 字符串变量 l n j \0
printf("str size = %lu\n", sizeof(str));
char charValues[] = {'l', 'n', 'j'}; // 字符数组 , 这个并不是字符串, 而是字符数组
printf("charValues size = %lu\n", sizeof(charValues));
int num = 10;
float floatValue = 10.1f;
double doubleValue = 9.9;
char charValue = 'm';
printf("%i, %f, %lf, %c\n", num, floatValue, doubleValue, charValue);
*/
/*************************华丽的分割线*******************************/
/*
// 内存寻址从大到小
char str[] = "lnj"; // 字符串变量
char str2[] = {'x', '\0' ,'m', 'g'}; // 字符数组
// 如何输出字符串变量, %s
// str 数组的名称, 数组的名称就是数组的地址
// %s的原理, 从传入的"地址"开始逐个取出, 直到遇到"\0"位置
printf("str = %s\n", str2); // offc3
*/
/*************************华丽的分割线*******************************/
// 字符串注意点, 字符串的初始化
char str1[] = "lnj";
char str2[] = {'l', 'n', 'j', '\0'};
// 部分初始化, 部分初始化中, 没有被初始化的元素默认是0
// \0对应的ASCII 0
char str3[10] = {'l', 'n', 'j'}; // l n j 0000000
char str4[3] = {'l', 'n', 'j'}; // 该方式不是字符串, 而是字符数组, 因为没有\0
char str5[] = {'l', 'n', 'j'}; // 错误写法
// 需要明白的一点就是字符串以\0结尾, 没有\0就不是字符串
// 只要是用双引号括起来的都是字符串
// 字符串的本质就是数组
char str6[] = "lnj";
str6[1] = 'y';
printf("%s", str6);
return 0;
}
字符串的输入,输出及计算长度
#include <stdio.h>
#include <string.h>
int myStrlen(char str[]);
int myStrlen2(char str[], int length);
int main(int argc, const char * argv[]) {
// 1.如何输出字符串
/*
// 1.1可以使用printf的%s占位符来输出
// 弊端 : 如果想要换行, 必须加上\n
// 优点 : 可以自定义格式化需要输出的字符串, 也就是可以按照我们需要的格式来输出
char str[] = "lnj";
printf("name = %s!!!!\n", str);
printf("-------\n");
// 1.2可以使用puts函数来输出
// 优点: 可以自动换行
// 缺点: 不可以自定义格式, 只能原样输出
puts(str);
printf("-------\n");
*/
/*************************华丽的分割线*******************************/
// 2.如何输入字符
/*
// 2.1利用scanf接收字符串的注意点
// scanf接收字符串, 会以空格 , tab, 回车作为结束符号, 也就是说利用scanf接收字符串时, 字符串中不能出现空格, tab, 回车
printf("请输入一个字符串\n");
char buf[10];
scanf("%s", buf);
printf("buf = %s\n", buf);
printf("-------\n");
// 2.2利用gets接收字符串
// warning: this program uses gets(), which is unsafe.
// 如果使用gets接收字符串, 系统会提示我们正在使用一个不安全的方法接收字符
// 优点: 如果利用gets接收字符串 , 可以在字符串中输入空格, tab
printf("请输入一个字符串\n");
char buf2[10]; // lnj c
gets(buf2);
printf("buf = %s\n", buf2);
printf("-------\n");
*/
/*************************华丽的分割线*******************************/
// 3.如何计算字符串的长度
// 0123
char str[] = "lnj cool"; // 3
// int length = sizeof(str) / sizeof(str[0]) - 1;
// strlen的原理: 从传入的地址开始逐个取出字符串, 每取出一个就让计数器+1. 直到遇到\0为止
// size_t size = strlen(str); // 计算出来的结果不包括\0
// int size = myStrlen(str);
int length = sizeof(str) / sizeof(str[0]);
int size = myStrlen2(str, length);
printf("length = %lu\n", size);
for (int i = 0; i < size; i++) {
printf("str[%i] = %c\n", i , str[i]);
}
return 0;
}
int myStrlen2(char str[], int length)
{
// 1.定义变量记录取出了多少个字符
int count = 0;
// 2.遍历字符数组
for (int i = 0; i < length; i++) {
if (str[i] != '\0') {
count++;
}
}
return count;
}
// 自定义一个strlen函数
int myStrlen(char str[])
{
// 1.定义变量记录取出了多少个字符
int count = 0;
// 2.遍历字符数组
while (str[count] != '\0') {
count++; // 1 2 3
}
return count;
}
字符串的拼接,拷贝,比较
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
// 1.字符串拼接
/*
// 原理 : 首先遍历第一个字符串,直到遇到\0为止, 然后取出第二个字符串中的字符, 从\0的位置开始添加, 添加完毕之后再在最后添加一个\0
char str1[7] = "lnj"; // l n j c o o l \0
char str2[10] = " cool";
printf("拼接前: %s\n", str1);
// dest : 目标 src : 源
// 将src中的数据拼接到dest后面
// 注意: 要想使用字符串拼接函数, 那么dest必须是一个数组, 并且数组的长度必须大于拼接之后的长度 \
如果dest数组的长度, 不能完全存放dest+src+\0, 那么就会报错
// strcat(str1, str2);
// char * 相当于dest const char * 相当于src size_t 需要拼接的个数
// 为了避免拼接之后超出str1的存储范围, 那么可以动态计算str2中需要拷贝几个到str1后面不会超出
// str1能够存放的元素个数 - str1已经存放的个数 - \0
size_t length = sizeof(str1) / sizeof(str1[0]) - strlen(str1) - 1;
printf("length = %lu\n", length);
strncat(str1, str2, length);
printf("拼接后: %s\n", str1);
*/
/*************************华丽的分割线*******************************/
// 2.字符串拷贝
/*
char str1[4] = "lnj";
char str2[] = "cool";
printf("拷贝前 : str1 = %s\n", str1);
// char * 目标, const char * 源
// strcpy函数会将源的数据拷贝到目标中, 并且会覆盖掉目标中原有的数据
// 目标的容积必须能够存放拷贝的数据, 如果容积不够会报错
// strcpy(str1, str2);
// char * 目标, const char * 源 size_t 需要拷贝几个
// 注意: 拷贝操作是逐个替换, 拷贝了几个就替换几个
// str1能够存放元素的个数 - 1是给\0留出位置
int length = sizeof(str1) / sizeof(str1[0]) - 1;
strncpy(str1, str2, length);
printf("拷贝后 : str1 = %s\n", str1);
*/
/*************************华丽的分割线*******************************/
// 3.字符串比较
/*
char str1[] = "aac"; // a a
char str2[] = "abc"; // a b
// strcmp它会对传入的字符串进行比较, 比较完毕之后会返回一个整型的值给我们
// 如果该值等于0,那么证明两个字符串相等
// 如果该值小于0, 那么证明str1小于str2
// 如果该值大于0, 那么证明str1大于str2
// strcmp的原理: 取出字符串中的每一个字符进行逐个比较, 如果发现不相等就不会继续往下比较
int res = strcmp(str1, str2);
printf("res = %i\n", res);
*/
return 0;
}
网友评论