复试上机刷题1 字符串链接 | 字符串返回的四种方式

0x01、题目信息

题目如下,原题链接在这里

题目描述
不用strcat 函数,自己编写一个字符串链接函数MyStrcat(char dstStr[],charsrcStr[])

输入描述:
两个字符串,字符串由小写字母组成。

输出描述:
链接后的字符串

示例1

输入
hello world
good morning

输出
helloworld
goodmorning

0x02、分析思路

首先看到字符串拼接,第一反应是使用strcat,但是很遗憾,题目明确禁止strcat,抖一下机灵,使用sprintf函数试试

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *str3;
    char str1[20],str2[20];
    while(scanf("%s",str1) != EOF){
        scanf("%s",str2);
        getchar();
        str3 = (char *) malloc(strlen(str1) + strlen(str2));
        sprintf(str3, "%s%s", str1, str2);
        printf("%s\n",str3);
    }
    return 0;
}

没错,通过了
在这里插入图片描述
还是回归正常思路吧,分析如下:

  • 由题构建一个函数MyStrcat(char dstStr[],char charsrcStr[]),将字符串拼接
  • 字符串拼接可以使用新建第三个字符串,将输入的两个串分别一个一个字母写入
  • 将字符串返回回main函数
  • main函数需要保证循环间隔空格读取字符串,使用scanf需要清理换行符,这里可以使用getchar

所以最终代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char * MyStrcat();


char * MyStrcat(char dstStr[],char charsrcStr[]){
    static char sumstr[100];
    int len1 = strlen(dstStr);
    int len2 = strlen(charsrcStr);
    int i = 0;
    for(int j = 0;j < len1;j++){
        sumstr[i] = dstStr[j];
        i++;
    }
    for(int j = 0;j < len2;j++){
        sumstr[i] = charsrcStr[j];
        i++;
    }
    return sumstr;
}


int main()
{
    char *str3;
    char str1[20],str2[20];
    while(scanf("%s",str1) != EOF){
        scanf("%s",str2);
        getchar();
        str3 = MyStrcat(str1,str2);
        printf("%s\n",str3);
    }
    return 0;
}

0x03、字符串返回

上述代码,我使用了一个局部静态变量来返回字符串给主函数,一般常用方法有四种,总结如下:

  1. 将字符串指针作为函数参数传入,并返回该指针。

  2. 使用malloc函数动态分配内存,注意在主调函数中释放。

  3. 返回一个静态局部变量。

  4. 使用全局变量。

详细例子与解释如下:

方法一:将字符串指针作为函数参数传入,并返回该指针。

典型的strcpy()函数应该就是采用的这种方法,第一个参数为指向目的字符串的指针,返回值也为这个指针。

char* strcpy(char* des,const char* source)
 
{
	char* r=des;
	assert((des != NULL) && (source != NULL));
	while((*r++ = *source++)!='\0');
	return des;
}

方法二:使用malloc函数动态分配

一定要注意在主调函数中将其释放,应为malloc动态分配的内存位于堆区,而堆区的内存是要我们自己来释放的。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * retstring();
int main()
{
    char * name2;
    name2 = retstring();
    printf("%s\n",name2);
    //记住一定要用free释放,否则会造成内存泄露
    free(name2);
    return 0;
}

char * retstring()
{
    char * name;
    name = (char *)malloc(10); 
    strcpy(name,"张汉青");
    return name;
}

方法三:返回一个静态局部变量

一个例子如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * retstring();
int main()
{
    char * name2;
    name2 = retstring();
    printf("%s\n",name2);
    return 0;
}

char * retstring()
{
    static char name[10];
    strcpy(name,"张汉青");
    return name;
}

这种方法有一个问题: 由于采用了静态局部变量(位于静态区,程序结束时由系统进行释放),这就导致,如果多次调用这个函数,下一次调用会将上一次调用的结果覆盖掉。

C语言中的库函数,tmpnam()函数、getenv()函数等应该都是采用的这种方法,这也就是为什么,使用这样的函数的时候应该立即将返回结果拷贝一份的原因

方法四: 使用全局变量

一个例子如下:

char   g_s[100]; 
char*   fun() 
{ 
        strcpy(g_s,   "abc "); 
        return   g_s; 
} 

参考链接:
https://www.cnblogs.com/qingergege/p/6496683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值