一般形式:puts(字符数组)
作用:输出一个字符串
一般形式:gets(字符数组)
作用:从终端输入一个字符串到字符数组函数。
#include
int main()
{
char *pstr; //野指针 乱指
//char *pstr = NULL;//什么都不指
//二者均会报错
printf("请输入字符:\n");
gets(pstr); //字符串输入 或者用scanf
//scanf("%s",pstr);
puts(pstr); //字符串输出
return 0;
}
以上代码会报错
因为造成非法内存访问(不论使其为野指针还是使其等于NULL)
如何解决以上问题:
1.定义成数组的形式:
char pstr[128] = {'\0'};
2.开辟空间:
char *pstr;
pstr = (char*)malloc(128);
char pstr[128] = {’\0’};
1.申请空间
2.初始化
把每一个元素都初始化成\0
char *pstr;
pstr = (char*)malloc(128);
if(pstr == NULL){
printf("内存申请失败\n");
exit(-1);
}
memset(pstr,'\0',128); //初始化的对象 初始化的字符 多大
注意:
malloc 1.要防止内存泄漏的问题
2.申请内存可能会失败,要对返回值作判断
原型声明:
char * strcpy(char * dest, const char *src);
功能:
把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
语法
char *strncpy(char *destinin, char *source, int maxlen);
参数
destinin:表示复制的目标字符数组;
source:表示复制的源字符数组;
maxlen:表示复制的字符串长度。
char *dest;
dest = (char*)malloc(128);
memset(dest,'\0',strlen(dest));
char *src = "do not know";
strcpy(dest,src);
puts(dest);
memset(dest,'\0',strlen(dest));
strncpy(dest,src,3);
puts(dest);
原型
extern char *strcat(char *dest, const char *src);
功能
把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除dest原来末尾的“\0”)。要保证dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
说明
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
strcmp函数是string
compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1str2,则返回正数
规则
当s1
当s1>s2时,返回正数。
char *dest2;
dest2 = (char*)malloc(128);
strcpy(dest2,"yes,I do.");
// 或者定义成数组 char dest2[128] = "yes,I do ";
strcat(dest2,src);
puts(dest2);
char *str1 = "1234";
char *str2 = "123";
int ret = strcmp(str1,str2);
printf("ret = %d\n",ret);
函数原型
char *strchr(const char *str, int c)
参数
str-- 要被检索的 C 字符串。
c-- 在 str 中要搜索的字符。
功能
在参数str所指向的字符串中搜索第一次出现字符c(一个无符号字符)的位置。
返回值
返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针
功能:
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
char *str = "are you here";
char *r = strchr(str,'e');
if(r == NULL){
printf("do not find\n");
}else{
printf("find\n");
}
char *str1 = "heavy sea is handsome";
char *str2 = "is";
char *ret = strstr(str1,str2);
puts(ret);//输出 is handsome
原型:
extern char *strlwr(char *s);
功能:
将字符串s参数转换为小写形式
说明:
只转换s参数中出现的大写字母,不改变其它字符。返回指向s参数的指针。
兼容性说明:
strlwr和strupr不是标准C库函数,只能在VC中使用。linux gcc环境下需要自行定义这个函数。
strupr,
将字符串s转换为大写形式。
说明:只转换s中出现的小写字母,不改变其它字符。返回指向s的指针。
兼容性说明:
strupr不是标准C库函数,只能在VC中使用。在linux gcc环境下需要自行定义这个函数。
注意在windows环境下,需要定义数组形式
char str[] = "Hello World"; //定义成数组
puts(strlwr(str));
puts(strupr(str));
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。
原型
char *strtok(char s[], const char *delim);
注意:需要定义成数组的形式,否则可能会引起段错误
例如:char str[ ] = “hello world”;
功能
分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
例如:strtok(“abc,def,ghi”,","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。
strtok的函数原型为char *strtok(char *s, char *delim),功能为作用于字符串s,以包含在delim中的字符为分界符,将s切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。
说明
strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
返回值
从s开头开始的一个个被分割的串。当s中的字符查找到末尾时,返回NULL。
如果查找不到delim中的字符时,返回当前strtok的字符串的指针。
所有delim中包含的字符都会被滤掉,并将被滤掉的地方设为一处分割的节点。
使用
strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。
char str4[] ="heavy,sea,hello,world"; //定义成数组
char *p;
p = strtok(str4,",");
if(p != NULL){
printf("the first str is %s\n",p);
}
int i;
for(i=0;i<3;i++){
p = strtok(NULL,",");
if(p != NULL){
printf("the str is %s\n",p);
}
}