字符串的使用
1:在字符型数据中,输出字符串用%s,输出单个字符用%c;
2:字符数组的赋值:数组不允许整体赋值,必须要单个赋值
实现字符数组的拷贝:
Void main(char *des, char *src)//des 是目的数组,src是源数组
void Mystrcpy1(char *des,char *src) //不用再在形参表中传数组长的是因为字符数组中的’\0’可以作为结束标志
{
int i;
for(i=0;src[i]!='\0';i++)//遍历字符数组的第一种方式,是让变量i移动;
{
des[i] = src[i]; /des[i] == *(des+i);
}
des[i] = '\0'; //给目的数组增加字符串的结尾标志‘\0’;
}
void Mystrcpy2(char *des,char *src)//遍历字符数组的第二种方式,
{
int i;
for(i=0;*(src+i)!='\0';i++) //这是用指针代替了数组,因为des[i] 就等于 *(des+i);
{
*(des+i) = *(src+i);
}
*(des+i) = '\0'; //给目的数组增加字符串的结尾标志‘\0’;
}
void Mystrcpy3(char *des,const char *src) //遍历字符数组的第三种方式,因为源数组是不可以改变的,所以用const加以修饰
{
while(*src != '\0')//遍历字符数组的第三种方式,与上面不同的是,这种方法不用变量i加加,而是直接用指针;
{
*des = *src;
//*src = '\0'; //因为有了形参表中的const定义所以如果要是这样写的话是错误的,因为const直接修饰了*scr.所以src是只可读不可写的右值,不能做左值 ;
des++; //
src++;
}
*des = '\0'; //给目的数组增加字符串的结尾标志‘\0’;
}
void Mystrcpy4(char*des,char *src) //遍历字符数组的第四种方式,
{
while(*src != '\0')
{
* *des++ = *src++; //因为这是后置++,所以它的执行顺序是先将src的值赋给des,然后des和src再++
}
*des = '\0'; //给目的数组增加字符串的结尾标志‘\0’;
}
void Mystrcpy5(char *des,char *src) //遍历字符数组的第五种方式
{
* while(*des++ = *src++) ;// 执行的条件是数组中的这些字符”abcd...”的ASC11码值都不为0,所以while语句中的表达式值为真,可以继续循环直到为‘\0’时停止循环,执行的顺序是先将src的值赋值给des,然后判断表达式的值是否为然后src和des再分别++,这时已经把src中的’\0’已经复制到了des中,所以在这种方式中最后不用再额外给des赋’\0’;
}
断言 的头文件#include<assert.h>
char * Mystrcpy(char *des,const char *src)
{
assert(des!=NULL && src!=NULL);//断言:断定表达式一定为真.如果为假程序崩溃,即断定des和src一定不为0;
if(des==NULL || src==NULL)
{
return ; //返回空值
}
char *p = des;
while(*des++ = *src++);
return p;
}
int Div(int a,int b)
{
assert(b != 0); //断定b一定不为0;*这种常用在除数为0时
return a/b;
}
int main()
{
//printf("%d\n",Div(100,0));
char arr[10] = "xbcdef";
char brr[10];//
char crr[10];
strcpy(brr,arr); //返回值的作用:实现链式表达
strcpy(crr,arr);
strcpy(crr,strcpy(brr,arr)); //链式表达,灵活
return 0;
}
计算字符串的长度:统计字符串的有效长度,不包含'\0'
代码:
int Mystrlen(const char *str)
{
* assert(str != NULL);
if(str == NULL)
{
return 0;
}
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{ // sizeof是计算字符串所占的总内存空间(字节数),strlen计算字符串中一共有多少个字符;
在纯ASCII码下,字节数=字符串长度=字符个数,因为每个字符就一个字节。
char str1[100] = "abcde"; //100,5 因为是定义了一个字符数组,并且长度是100,但是字符型占一个字节,所以字节数是100,从str1[5]开始后面都是’\0’; ‘\0’就是0; 计算字符串长度不包括后面的’\0’,所以strlen是5
char str2[] = "abcde"; //6,5 这里的字节数为6是因为要加上‘\0’,因为它是字符串,字符串就一定一’\0’结束;而算长度的时候就不加‘\0’;
char *str3 = "abcde";//4,5 因为是定义了一个指针所以字节数为4,
char str4[100] = "abcd\0ef\n";//100,4 因为是定义了一个长度为100的字符型数组;因为在str4[4]时遇见了’\0’,所以在算字符串的长度时就要停止了,因为字符串以’\0’结尾;,所以字符串长度是4;
char str5[] = "abcd\0ef\n";//9,4,在计算字节数的时候不用管是否有’\0’,因为只要是字符就占内存空间;所以占9个字节,4的原因同上;
char *str6 = "abcd\0ef\n";//4,4 因为是定义了一个指针str,一个指针所占的字节数为4(32平台),所以该sizeof为4,第二个4的原因同上;
printf("%d,%d\n",sizeof(str1),strlen(str1));
printf("%d,%d\n",sizeof(str2),strlen(str2));
printf("%d,%d\n",sizeof(str3),strlen(str3));
printf("%d,%d\n",sizeof(str4),strlen(str4));
printf("%d,%d\n",sizeof(str5),strlen(str5));
printf("%d,%d\n",sizeof(str6),strlen(str6));
//char *str = "abcde";//计算字符串的长度
//printf("%d\n",Mystrlen(str));
return 0;
}
统计单词个数:例:”abcde 12, def”
方法:一个字母一个字符可以判断它是一个字母,如果用一个字符一个字母的方法来判断的话会漏掉一个单词,比如“abcde 12, def”,第一个是字符就是引号,所以要用前一种方法;
#include <stdio.h>
#include <assert.h>
#include<string.h>
#include <ctype.h>//是isalpha函数的头文件,该函数是用来判断一个字母是否为小写字母的
char Words( const char *arr)
{
assert (arr != NULL);
if(arr == NULL)
{
return 0;
}
int i = 0, count = 0;
for(i=0; arr[i]!='\0'; i++)
{
* if('a'<=arr[i]&&arr[i]<='z' && 'a'>=arr[i+1]&&arr[i+1]>='z')
count++;
} (1) //用这种方法判断一个字母是否为小写字母的前提条件是字母表必须是连续的
return count;
}
int main()
{
char des[] ="abcd 12,def";
printf("%d\n",Words(des));
return 0;
}
(2)以后判断字母的是否为小写的时候要用以下的方法:
If (isalpha(str[i]) && !isalpha[i+1]);
{
I++;
}
如果我们一定要用(1)中的方法那就请自己列出字母表
**bool Islower( char ch)
{
char chars[] = "abcdefghijklmnopqrstuvwxyz"; //自己罗列一个字母表
for(int i=0; chars[i]!='\0'; i++)
{
if(chars[i] == ch)
{
return ture;
}
else
{
return false;
}
}
}