我是C的新手。我有一个名为kstrfrom的函数需要创建并返回一个新的kstring对象,该对象包含一个以null结尾的C字符串的内容副本,包括空终止符。 / p>
返回的kstring的.length成员应该是cstr的长度,加上null终止符的长度。 .data成员应该是指向新分配的内存的指针,你已经复制了cstr的内容,包括最后的空字节。
如果分配内存时出错,则此函数应调用abort()或抛出未捕获的异常。
Locale loc = new Locale("ar");
/* under API 20 */
tts.setLanguage(loc);
/* over API 21 */
String voiceName = loc.toLanguageTag();
Voice voice = new Voice(voiceName, loc, Voice.QUALITY_HIGH, Voice.LATENCY_HIGH, false, null);
tts.setVoice(voice);
我已经运行了一些测试用例:
TextToSpeech
正如您所见,我需要帮助提供正确的链接,包含正确的数据和复制数据。
答案 0 :(得分:1)
在
结束时 while(*cstr!='\0')
{
cstr+=1;
length+=1;
}
你丢失了cstr的初始值
试
int length=1;
char * tmp = cstr;
while(*tmp!='\0')
{
tmp+=1;
length+=1;
}
您没有设置长度成员......
cdest.length = length + 1;
返回kstring是有问题的。
kstring res;
res = kstrfrom( "My String" ); /* works */
kstrfrom( "Another string" ); /* leaks memory */
其他评论描述了您如何忽略语言功能。 使用...可以更轻松地实现代码。
kstring kstrfrom(const char *cstr)
{
kstring cdest={NULL,0};
cdest.data = strdup( cstr );
if( cdest.data == NULL ){
abort();
}
cdest.length = strlen( cstr ) + 1; /* not done in original example */
return cdest;
}