这是我的代码。我想从用户那里得到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;
}
我尝试了一些修改,但没有一个起作用。我希望程序像这样运行:
用户输入:嗨
espeak说:嗨
用户输入:一个
espeak说:
(5
输入)
但是当我尝试插入超过4个字符作为输入时,它给出了
segmentation fault
错误! 最佳答案
两个主要问题是:
您在未初始化的char数组上使用strlen
;unique_identifier
的espeak_Synth
参数必须为NULL
或指向无符号的int(请参见source code),而现在它是指向随机内存的无符号的指针。
将strlen
移到scanf
之后,使用NULL
代替unique_identifier
,您的代码将突然起作用(类似)。
但是,还有许多其他问题:无用的变量,未初始化的变量,无输入清除等。 IMO更好的方法是丢弃test
函数,并从头开始对其进行正确重写。
附录
这就是我重写上面的代码的方式。它仍然不是最佳选择(没有输入清理,没有错误检查),但是IMO更加干净。
#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传递一些字符串,并且读取它们,但是出现“段错误”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47772076/