const char*作为返回值的困惑

本文探讨了C++中使用const char*作为返回值时遇到的问题,包括字符串被截断的现象及解决方案,如使用new分配内存或传入外部内存块。同时讨论了const char*作为返回值的合理性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先标题都不知道怎么样才能表达这个困惑,索性使用这个是因为当const char*作为返回值的时候有两个困惑之处:

1、如果有下面的情况

const char* Func(std::wstring wstr)
{
	std::string s = TO_ACSII(wstr.c_str());//使用_bstr_t或者自己写的转换函数
	return s.c_str();
}


这样返回的值是错误的,字符串最开始一个自己会变成0,导致整个字符串作废,如果舍弃第一个字符,那么字符串也就不是想要的结果,至今不知道为什么。

尝试过各种方法,比如参数改成const wchar_t*或者使用memcpy之类,都失败,调试的时候就发现,是std::string的阶段还是对的,一到s.c_str()这里返回就开始错误了。总之其他能想到的方法都试了,均失败。后来想到两种方法可以解决:1、new char[size],然后memcpy或者strcpy,返回出去就是正确的。2、从外面传进来内存块,大概是最安全的做法,具体是函数外面char sztmp[size];然后多一个char* 参数,具体怎么做,知道的就知道了,不知道的我懒得说了。


2、const char*作为返回值是个奇怪的设定,因为这个本来应该是常量。。。然而你在函数里声明一个常量返回出去显然毫无意义,但是除了使用std::string的c_str(),我还真不知道该用什么办法,难道是用一个静态字符串么?






int isVowel(char a) { char *addr = strchr("aeiouAEIOU", a); if (addr == NULL) { return 1; } return 0; } static int GetLongestFlawedVowelSubstrLen(int flaw, const char *str) { int left = 0; int right = 0; int flawNum = 0; int sum = 0; int length = strlen(str); while (right < length) { /* 处理右端点 */ if (!isVowel(str[right])) { flawNum++; } else { if (flawNum == flaw) { sum = (sum > (right - left + 1)) ? sum : (right - left + 1); } /* 处理左端点 */ while (flawNum > flaw || !isVowel(str[left])) { if (!isVowel(str[left])) { flawNum--; } left++; } } } return sum; } 这是代码,下面这个是题目,你帮我看看圈复杂度可以怎样降低 定义:开头和结尾都是元音字母(aeiouAEIOU)的字符串为 元音字符串 ,其中混杂的非元音字母数量为其 瑕疵度 。比如: "a" 、 "aa"是元音字符串,其瑕疵度都为0 "aiur"不是元音字符串(结尾不是元音字符) "abira"是元音字符串,其瑕疵度为2 给定一个字符串str和瑕疵度flaw,请找出瑕疵度等于 flaw 的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符子串,输出0。 子串:字符串中任意个连续的字符组成的子序列称为该字符串的子串。 输入 首行输入一个整数 flaw,取值范围 [0, 65535]。 接下来一行是字符串str,仅由字符a-z和A-Z组成,字符串长度 (0, 65535]。 输出 输出为一个整数,代表满足条件的元音字符子串的长度。
最新发布
08-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值