gpt4 book ai didi

c++ - 我试图通过 espeak 传递一些字符串,它会读取它们,但我得到 "segmentation fault"

转载 作者:行者123 更新时间:2023-11-28 04:52:59 24 4
gpt4 key购买 nike

这是我的代码。我想从用户那里得到 5 个字符串,当用户插入它时,espeak 会读取它们中的每一个。但是我收到了 segmentation fault(core dumped) 消息。

#include <string.h>
#include <malloc.h>
#include <espeak/speak_lib.h>

int test()
{

espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;
char *path=NULL;
int Buflength = 500, Options=0;
void* user_data;
t_espeak_callback *SynthCallback;
espeak_PARAMETER Parm;



char Voice[] = {"English"};

int i=0;
char text[1000];
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;


output = AUDIO_OUTPUT_PLAYBACK;

espeak_Initialize(output, Buflength, path, Options );
espeak_SetVoiceByName(Voice);
const char *langNativeString = "en_US";
espeak_VOICE voice={0};

voice.languages = langNativeString;
voice.name = "US";
voice.variant = 2;
voice.gender = 1;
Size = strlen(text)+1;


for (i=0; i<5; i++)
{

scanf("%s ", &text);

printf("%s", text);

espeak_Synth( text, Size, position, position_type, end_position, flags,
unique_identifier, user_data );
espeak_Synchronize( );
fflush(stdout);

}

return 0;
}






int main(int argc, char* argv[] )
{
test();

return 0;
}

我尝试了一些修改,但都没有奏效。我希望程序像这样工作:

User input: hi

espeak says: hi

user input: one

espeak says: one

(for 5 inputs)

但是当我尝试插入超过 4 个字符作为输入时,它给出了 segmentation fault 错误!

最佳答案

两个主要问题是:

  1. 您在未初始化的字符数组上使用 strlen
  2. espeak_Synthunique_identifier 参数必须是 NULL 或指向一个无符号整数(参见 source code ),而现在它是一个指向随机内存的无符号指针。

strlen 移到 scanf 之后,使用 NULL 而不是 unique_identifier 并且您的代码将突然工作(有点像).

但是还有许多其他问题:无用的变量、未初始化的变量、没有输入清理等等。 IMO 更好的方法是丢弃 test 函数并从头开始正确重写它。

附录

这就是我重写上面代码的方式。它仍然不是最理想的(没有输入清理,没有错误检查)但在我看来它很多更干净。

#include <stdio.h>
#include <string.h>
#include <espeak/speak_lib.h>

static void say(const char *text)
{
static int initialized = 0;
if (! initialized) {
espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 0, NULL, 0);
espeak_SetVoiceByName("en");
initialized = 1;
}
espeak_Synth(text, strlen(text)+1,
0, POS_CHARACTER, 0,
espeakCHARS_UTF8, NULL, NULL);
espeak_Synchronize();
}

int main()
{
char text[1000];
int i;

for (i = 0; i < 5; ++i) {
scanf("%s", text);
say(text);
}

return 0;
}

关于c++ - 我试图通过 espeak 传递一些字符串,它会读取它们,但我得到 "segmentation fault",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47772076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com