int no_space_str(char* str) {
int count = 0;
char* p = str;
while (*p) {
if (*p != ' ') {
count++;
}
p++;
}
return count;
}
int main(void) {
char str[] = "he ll o";
int ret = no_space_str(str);
printf("%d\n",ret);
system("pause");
return EXIT_SUCCESS;
}
输出:
5
字符串逆序:
hello-------》olleh
类似三杯水法交换两边变量
void str_inserse(char* str) {
char* start = str; //记录首元素地址
char* end = str + strlen(str)-1; //记录最后一个元素地址
while (*start<*end) { //首元素地址是否 < 最后一个元素地址
char tmp = *start; //三杯水char元素交换
*start = *end;
*end = tmp;
start++; //首元素对应指针后移
end--; //尾元素指针前移
}
}
int main(void) {
char str = "hello";
str_inserse(str);
printf("str=%s\n",str);
system("pause");
return EXIT_SUCCESS;
}
判断回文字符串:
int str_abcbb(char* str) {
char* start = str; //记录首元素地址
char* end = str + strlen(str) - 1; //记录最后一个元素地址
while (*start < *end) { //首元素地址是否 < 最后一个元素地址
if (*start != *end) { //判断字符是否一致
return 0;
}
start++;
end--;
}
return 1; //表示回文
}
int main(void) {
char str[] = "this is a test";
str_abcbb(str);
printf("str=%s\n-----------\n",str);
char s2[] = "abcmbba";
int ret = str_abcbb(s2);
if (ret == 0)
printf("不是回文\n");
else if (ret == 1)
printf("是回文\n");
system("pause");
return EXIT_SUCCESS;
}
字符串处理函数:
#include<string.h>
字符串拷贝:
strcpy:
将src的内容拷贝给dest。返回dest。保证dest空间足够大。
char *strcpy(char *dest,const char *src);
函数调用结束返回值和dest参数结果一致。
strncpy:
char *strcpy(char *dest,const char *src,size_t n);
char dest[5];
char src[]="hello strcpy";
int main(void) {
char src[] = "abcd efgh ijklm n";
char dest[100] = { 0 };
char* p = strcpy(dest, src); //字符串src 拷贝给dest
printf("p=%s\n",p);
printf("dest=%s\n",dest);
system("pause");
return EXIT_SUCCESS;
}
字符串拼接:
strcat:
将src的内容拼接到dest后,返回拼接后的字符串。
char *strcat(char *dest,const,sonst char *src);
int main(void) {
char src[] = "world";
char dest[] = "hello";
char *p=strcat(dest,src);
printf("p=%s\n",p);
printf("dest=%s\n",dest);
system("pause");
return EXIT_SUCCESS;
}
strncat:
将src的前n个字符,拼接到dest后。形成一个新的字符串。保证dest空间足够大。
char *strncat(char *dest,const char *srrc,size_t n);
int main(void) {
char src[] = "world";
char dest[] = "hello";
char *p=strncat(dest,src,3);
printf("p=%s\n",p);
printf("dest=%s\n",dest);
printf("%d\n",strlen(dest));
system("pause");
return EXIT_SUCCESS;
}
字符串比较:
strcmp:
比较s1和s2两个字符串,如果相等,返回0,如果不相等,进一步表s1和s2对应位ASCLL码
s1>s2 返回1
s1<s2 返回-1
int strcmp(const char*s1,const char *s2);
strncmp:
int strcmp(const char*s1,const char *s2,size_t n);
比较s1和s2两个字符串的前n个字符,如果相等,返回0,如果不相等,进一步表s1和s2对应位置的ascll码值。(不比较ascll码的总和)
s1>s2 返回1
s1<s2 返回-1
int main(void) {
char* str1 = "helloworld";
char* str2 = "helloz";
printf("ret=%d\n",strcmp(str1,str2)); // 调用比较,1》2输出1,反之输出-1,相等则是0
printf("ret=%d\n",strncmp(str1,str2,3)); //调用比较前三个
system("pause");
return EXIT_SUCCESS;
}
字符串格式化输入、输出:
sprintf():
根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符‘\0’为止。
int sprintf(char *str,const char *format,.....)
对应printf();将原来写到屏幕的“格式化字符串”,写到参数1str中
sprintf(str,"%d+%d=%d\n",10,24,10+24);格式串
int main(void) {
char buf[100] = { 0 };
sprintf(buf,"%d%c%d=%d\n",10,'+',34,10+34);
system("pause");
return EXIT_SUCCESS;
}
sscanf():
从str指定的字符串读取数据,并且根据参数format字符串来转换并格式化数据
int sprintf(char *str,const char *format,....);
对应scanf,将原来从屏幕获取的“格式化字符串”,从参数1str中获取。
scanf("%d+%d=%d",&a,&b,&c); a--->10,b-->24 c-->45
int main(void) {
char buf[100] = { 0 };
int a, b, c;
char str[] = "1+1=2";
sscanf(str, "a=%d\n", &a, &b, &c);
printf("a=%d\n", a);
printf("b=%d\n", b);
printf("c=%d\n", c);
system("pause");
return EXIT_SUCCESS;
}
字符串查找字符、子串:
strchr():
在字符串str中 还找一个字符出现的位置。返回字符在字符串中的地址。
char *strchr(const char *s,int c);
printf("%s\n",strchr("hehehahoho",'a'); -->"ahahoho"
strrchr():
自右向左,在字符串str中 还找一个字符出现的位置。返回字符在字符串中的地址。
printf("%s\n",strrchr("hehehahoho",'a'); -->"ahahoho"
strstr():
在字符串str中,找子串substr第一次出现的位置,返回地址。
char *strstr(const char *str,const char *substr);
在字符串中找子串的位置。
printf("%s\n",strrchr("hehehahahoho","ho")); ---->"hoho"
printf("5s\n",strtchr("hehehahahoho","xixi")); ------->NULL
字符串分割:
strtok():
按照既定的分隔符,来拆分字符串。“www.baidu.com“ ----》“www\0baiducom”
char *strtok(char *str,const char*delim);
参数1:待拆分字符串
参数2:分割符组成的“分割串”
返回:字符串拆分后的首地址。“拆分”:将 分割字符用 ‘\0’
strtok("www.baidu.com",",")
int main(void) {
char str[] = "www.baidu.com";
char *p=strtok(str, ",");
printf("p=%s\n",p);
for (size_t i = 0; i < 13; i++) {
printf("%c\n",str[i]);
}
system("pause");
return EXIT_SUCCESS;
}
输出:
p=www.baidu.com
w
w
w
.
b
a
i
d
u
.
c
o
m
int main(void) {
char str[] = "www.baidu.com.net";
char* p = strtok(str, ","); //第一次拆分,参数1 传 待拆分的原串
while (p != NULL) {
p = strtok(NULL, ","); //第1+次拆分是,参数1传NULL
printf("%s\n",p);
}
system("pause");
return EXIT_SUCCESS;
}
输出:
NULL
特性:
strtok拆分字符串是直接在原串上操作,所以要求参数1必须,可读可写(“char *str="www.baidu.com"----不可行)
练习:
拆分“www.baidu.com”
char str[] = "www.baidu.com";
char* p = strtok(str, ".");
while (p != NULL) {
p = strtok(NULL);
}
输出:
p=www
p=baidu
p=com
p=(null)