C语言练习2
1.重写strcpy函数
char* my_strcpy(char* strDest,const char* strSrc) {
char* strTemp = strDest;
if (strDest == NULL || strSrc == NULL) {
return NULL;
}
while (*strSrc != '\0') {
*strTemp++ = *strSrc++;
}
*strTemp = *strSrc;
return strTemp;
}
Action()
{
char str1[] = "Hello";
char str2[] = "qiumengjiao";
//char * str1 = "Hello";//如果这样用char *定义str1,该程序是会报错的,因为此时的"Hello"是存放在常量区的,无法修改到它的值
//char * str2 = "qiumengjiao";
//char * str2 = (char *)malloc(sizeof(char) * 10);//这样动态获取地址去存放替换后的值也可以,因为定义的指针是存放在堆,可以修改到值
lr_output_message("%s",str2);//校验没有调用函数str2输出原有的值
my_strcpy(str2, str1);
lr_output_message("%s",str2);//调用my_strcpy函数后,输出str2被str1替换的值“hello”
return 0;
}
结果如下:

2.重写strcat函数
char* my_strcat(char* strDest,const char* strSrc) {
if (strDest == NULL || strSrc == NULL) {
return NULL;
}//安全检查
while (*strDest != '\0') {
strDest++;
}
while (*strSrc != '\0') {
*strDest++ = *strSrc++;
}
*strDest = '\0';
return strDest;
}
Action()
{
char str1[] = "Hello";
char str2[] = ",qiumengjiao!";
lr_output_message("未调用函数前字符串为:%s",str1);
my_strcat(str1, str2);
lr_output_message("将str2的字符追加到str1后的字符串为:%s",str1);
return 0;
}
结果如下:

3.请编写一个函数,要求实现如下功能:
对字符串“jieofAoo)))eEe**7dfUe^^fds^%dfs%”进行处理,统计出非法字符的个数(字母,数字以外的字符都为非法字符)。
Action()
{
char * str = "jieofAoo)))eEe**7dfUe^^fds^%dfs%";
int len;
len = strlen(str);
lr_output_message("字符串个数为:%d",len);
while (*str) {
if(*str<=57&&*str>=48){
len--;
}else if(*str<=90&&*str>=65){
len--;
}else if(*str<=122&&*str>=97){
len--;
}
str++;
}
lr_output_message("字符串的非法字符的个数为:%d",len);
return 0;
}
结果如下:

4. 通过关联,我们获取到了一个字符串"192,000,123",现在要求去掉字符串中的逗号,并替换成两个%%,即:192%%000%%123请编写一个函数来实现它
char * replace(char *str,char *desc){
while(*str!='\0'){
if(*str == ','){
*desc++='%';
*desc++='%';
str++;
}
*desc++=*str++;
}
*desc='\0';
return desc;
}
Action()
{
char * str ="192,000,123";
int len,i;
char * desc;
len = strlen(str);
desc = (char *)malloc(2*len*sizeof(char *));
replace(str,desc);
lr_output_message("转换后的字符串为:%s",desc);
free(desc);
return 0;
}
结果如下:

5. 编写一个函数,查到1至10000内,能被7或者11整除,同时不能被7和11同时整除的数,并放到数组中打印出来
void fun(int *a, int * n)
{
int * p = a, i;
*n = 0;
for(i = 0; i < 100; i++)
{
if((i%7==0||i%11==0)&&!(i % 77 == 0))//判断i被7或11整除,且不能被7和11整除
{
*(a++) = i;//如果i满足条件,则将i存放到数组a里面;
(*n)++;//n是计算i被存入数组的次数
}
}
}
Action()
{
int str[100], n, k;
fun(str,&n);
for(k=0;k<n;k++)//循环输出数组,n返回的数值就是函数里面的n
{
lr_output_message("%d",str[k]); //在这里有个疑问,lr_output_message函数是自动换行的,我怎么可以实现与VC++一样的功能呢,一行输出10个,下方是VC++的输出;
/*
if((k+1)%10 ==0)
{
printf("%5d",aa[k]);
printf("\n");
}
else
printf("%5d",aa[k])
*/
}
return 0;
}
结果如下:为了方便截图,只拿了100来试数,但是我如果设置成10000.就会提示:


疑问:这是lr这个软件限制的吗?
6. 定义一个函数,实现对字符串做如下操作:当字符为字母时,对应的ASCII值加5,当字符为数字时,原样输出,当有其它字符出现时,结束操作,返回已处理的字符串(需要用指针的方式来实现)
char *fun(char *str,char *desc){
while (*str != '\0') {//判断字符串是否为空
if((*str<=90&&*str>=65)||*str<=122&&*str>=97)//A~~Z对应的ASCII码是[65,90],a~~z对应的ASCII码是[97,122]
{
*desc=*str+5;//字符为字母的加5赋值给desc
desc++;
str++;//继续判断下一个字符
}else if(*str<=57&&*str>=48)//0~~9对应的ASCII码是[48,57]
{
*desc=*str;
desc++;
str++;
}else
{
*desc='\0';
break;
}
}
return desc;
}
Action()
{
char *str = "Hello1234!qiumengjiao";
char *desc;
int len=strlen(str);
desc=(char *)malloc(len*sizeof(char *));
fun(str,desc);
lr_output_message("处理后的字符串为:%s",desc);
free(desc);//释放指针
return 0;
}
结果如下:


浙公网安备 33010602011771号