0注意易犯错误及建议:
1 、推荐使用fgets() 将一个位存放 '\0' 存放数据的时候不会越界。
不推荐使用gets() 易造成越界
2 、查错的时候,确定错误位置,一步一步检查。
3 、strlen() 在使用的时候获取字符长度,遇到 '\0' 即结束,注意在键盘无法输入 '\0' 代表的一个字符。
eg: char buf[128] = "hello\0world";
strlen(buf)的结果是 5
4 若想获取字符数组的全部字符,使用for循环或者while循环 遍历一遍可以全部取出。
1 不使用库函数实现 strlen()
// 1不使用库函数实现 strlen()
void test01()
{
char buf[128] = {'\0'}; // 将数组内全部元素赋值为 0 0 === '\0'
//char buf[128] = {0};
printf("请输入一串字符串 ");
fgets(buf,sizeof(buf),stdin);
int i=0;
// while(buf[i] != '\0')
// {
// i++;
// }
while(buf[i] && ++i); // 优化之后
int j = strlen(buf);
printf("计算得到的字符长度为%d\n",i);
printf("strlen得到的字符长度为%d\n",j);
}
/02 实现strcpy()
void test02()
{
char buf1[128] = {'0'};
char buf2[128] = {'0'};
printf("请输入一串字符串到buf1中 ");
fgets(buf1,sizeof(buf1),stdin);
//buf1[strlen(buf1)-1] = '\0'; 去掉换行
int i=0;
while(( buf2[i] = buf1[i] ) && ++i); // 若没有小括号的时候 考虑优先级 && 优先级比 = 优先级高
//buf[i] = '\0'; // buf2[i] = buf1[i] && ++i 先执行后面 buf1[i] && ++i 再执行前面 buf2[i] = (前面执行的结果)
printf("buf2中的字符串为 %s\nbuf1中的字符串为 %s\n ",buf2,buf1);
printf("sizeof(buf2)=%lu,strlen(buf2)=%lu",sizeof(buf2),strlen(buf2));
}
3 实现字符追加
void test03()
{
char buf1[128] = {'0'};
char buf2[128] = {'0'};
printf("请输入一串字符串到buf1中 ");
fgets(buf1,sizeof(buf1),stdin);
buf1[strlen(buf1)-1] = '\0';
printf("请输入一串字符串到buf2中 ");
fgets(buf2,sizeof(buf2),stdin);
buf2[strlen(buf2)-1] = '\0';
int i = 0;
while(buf1[i] && ++i); //找出buf1中字符数方便在后面追加
//buf1[i] = '\0';
int j=0;
while((buf1[i] = buf2[j]) && ++i && ++j);
printf("buf1的字符为:%s\n",buf1);
printf("buf2的字符为:%s\n",buf2);
}
4 实现字符的比较
// 4 实现字符的比较 例如 : buf1 = "hello" buf2 = "hellp" 前4个字母相同 比较第5个字母的ASCII码值
void test04()
{
char buf1[128] = ""; // 自动补一个 '\0'
char buf2[128] = ""; // 自动补一个 '\0'
printf("请输入buf1的字符串\n");
fgets(buf1,sizeof(buf1),stdin);
buf1[strlen(buf1)-1] = '\0';
printf("请输入buf2的字符串\n");
fgets(buf2,sizeof(buf2),stdin);
buf2[strlen(buf2)-1] = '\0';
int i = 0;
while(buf1[i] && buf2[i])
{
if(buf1[i] != buf2[i])
{
printf("buf1[%d]=%c buf2[%d]=%c\n",i,buf1[i],i,buf2[i]);
if(buf1[i] > buf2[i])
{
printf("buf1大于buf2");
}
else
{
printf("buf2大于buf1");
}
goto here;
}
i++;
}
here:
printf("结束");
}
5 判断是否为回文字符
void test05()
{
char buf[128] = "";
printf("请输入buf1的字符串\n");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = '\0';
printf("buf1长度为= %lu \n",strlen(buf));
int i=0,j=0;
int num,p=0;
j = strlen(buf)-1;
num = j/2;
while(p<=num)
{
if(buf[i] != buf[j])
{
printf("该字符串不是回文字符\n");
goto here;
//break; goto 或者break 二选一
}
p++;
i++;
j--;
}
printf("该字符是回文字符\n");
here:
printf("结束\n");
}
// 判断回文方法2
void test05_2()
{
char buf[128]= "";
printf("请输入一串字符,判断是否是回文字符\n");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = '\0';
printf("buf的字符长度为%lu\n",strlen(buf));
int i =0, j=0;
j = strlen(buf)-1;
for(;i<j;i++,j--)
{
if(buf[i] != buf[j])
{
break;
}
}
if(i<j)
{
printf("该字符串不是回文字符\n");
}
else
{
printf("该字符是回文字符\n");
}
}
6 输入插入位置插入字符
void test06()
{
char buf1[128] = "";
char buf2[128] = "";
printf("请输入buf1的字符串\n");
fgets(buf1,sizeof(buf1),stdin);
buf1[strlen(buf1)-1] = '\0';
int pos;
printf("请输入插入pos的位置\n");
scanf("%d",&pos);
gets(); // 吸收键盘缓冲器的换行
printf("请输入buf2的字符串\n");
fgets(buf2,sizeof(buf2),stdin);
buf2[strlen(buf2)-1] = '\0';
printf("输出buf1 %s\n",buf1);
printf("输出buf2 %s\n",buf2);
int size2 = (int)strlen(buf2); // buf2的字符长度
int size1 = (int)strlen(buf1); // buf1的字符长度-1 数组下标
// 第一步 先将buf1 pos之后的字符 移向后面
int i = 0;
while((size1-i) >= pos) // 判断 =
{
buf1[size1+size2-i] = buf1[size1-i] ; // i移动位置
i++;
}
// 第二步 将buf2 中的字符拷贝到 buf1中pos之后的位置
i = 0;
while(i<size2)
{
buf1[pos+i] = buf2[i];
i++;
}
// 第三步 将buf1最后 补上\0;
buf1[size1+size2] = '\0';
printf("插入后的buf1 =%s\n",buf1);
}