1,统计一个字符串中个字符的百分比:
如输入字符串asdfs
a —– 20%
s —– 40%
d —–20%
f —–20%
#include <stdio.h>
#include <string.h>
void percentage( char *str, int len )
{
int i = 0;
int j = 0;
int count = 1;
int num = 0;
while( *str != '\0' )
{
for( i = 1; i < len; i++ )
{
while( *str == *(str + i) )
{
count++; //当后面的字符串中有相同字符时,count+1
*(str + i) = ' '; //同时让相同的字符为' '
}
}
if(*str != ' ')
{
num = count * 100 / len; //不好直接输出百分比,让num等于百分比之前的数字,百分号用printf输出
printf("%c-------%d\%\n",*str,num); //输出字符和相应的占字符串中的百分比
count = 1; //让count又=1
}
str++; //判断下一个字符
}
}
int main()
{
char str[100] = {0};
int len = 0;
printf("please input astring:");
scanf("%s",str); //输入字符串
len = strlen(str); //定义len为字符串的长度
percentage(str,len); //调用percentage函数
return 0;
}
2、给一个字符串,有大小写字母,要求写一个函数把小写字母放在前面,大写字母放在后面,尽量使用最小空间,时间复杂度。(即用指针做)。
如:aAbBcCdD —abcdABCD
#include <stdio.h>
#include <string.h>
void str_sort(char *str,char *stra,char *strA)
{
while(*str != '\0')
{
if(*str >= 'a' && *str <= 'z')
{
*stra = *str;
stra++;
str++;
} //当字符为小写字母时将字符放进stra字符数组中
if(*str >= 'A' && *str <= 'Z')
{
*strA = *str;
strA++;
str++;
} //当字符为大写字母时将字符放进strA字符数组中
}
}
int main()
{
char str[100] = {0};
char stra[100] = {0};
char strA[100] = {0};
printf("please input a string:");
scanf("%s",str); //输入一段含有大写字母和小写字母的字符串
str_sort(str,stra,strA); //调用str_sort函数
printf("%s\n",strcat(stra,strA)); //输出stra、strA连接后的字符串
return 0;
}
3、自我实现atoi(字符串转整形)
如:“123”转换成 123
“-123” 转换成 -123
#include <stdio.h>
#include <string.h>
int convert(char *str)
{
int len = strlen(str);
int i = 0;
int num = 0;
int temp = 1;
if( str[0] == '-' )
{
temp = -1; //判断第一个字符是否为-,是让temp=-1
}
else
{
num = str[0] - '0'; //不是,让其转换为数字并赋给num
}
for(i = 1; i < len; i++)
{
num = num * 10 + *(str + i) - '0'; //将字符转换成数字
}
num = num * temp; //让num乘以temp,正数转换为正数,负数转换为负数
return num; //返回num的值
}
int main()
{
char str[100] = {0};
int num = 0;
printf("please input a string:");
scanf("%s",str); //输入数字字符串
num = convert(str); //调用转换函数
printf("%d\n",num); //输出转换后的数字
return 0;
}
4、自我实现itoa(整形转字符串)
如: 123 转换成 “123”
“-123” 转换成 -123
#include <stdio.h>
void convert(int num, char *str)
{
int i = 0;
int j = 0;
while( num != 0 )
{
if(num < 0)
{
num = -num; //如果num < 0,将其变成正数
}
i = num % 10 + '0';
str[j++] = i;
num /= 10; //从最低位开始将num中每一位取出加上'0'变成数字字符并存到str数组中
}
while(j--)
{
printf("%c",str[j]); //倒着输出str数组中的字符
}
printf("\n");
}
int main()
{
char str[100] = {0};
int num = 0;
printf("please input a number:");
scanf("%d",&num); //输入num的值
if(num < 0)
{
printf("-"); //如果num < 0,输出一个'-'
}
convert(num, str); //调用转换函数
return 0;
}
5、统计字符串中子串的个数。
如: 主串“aqwerqwerqwer”
子串 “qwer”
输出 3
#include <stdio.h>
void compare(char *str1, char *str2)
{
int count = 0;
char *p1 = NULL;
char *p2 = NULL; //定义p1 p2两个空指针
p1 = str1;
p2 = str2; //将str1和str2两个字符串分别赋给p1 p2
while(*p1 != '\0')
{
if(*p1 == *p2)
{
p1++;
p2++; //当两个指针里的字符相等时,比较下一个字符
}
else
{
p1++; //不相等时p1往后一个字符
}
if(*p2 == '\0')
{
count++; //当p2到最后时代表p1中有和p2一样的字符,让count+1
p2 = str2; //让p2再次等于str2
}
}
printf("%d\n",count); //输出count的值
}
int main()
{
char str1[100] = {0};
char str2[100] = {0};
printf("please input the first string:\n");
scanf("%s",str1); //输入字符串str1
printf("please input the second string:\n");
scanf("%s",str2); //输入字符串str2
compare(str1,str2); //调用compare函数
return 0;
}