我试图通过一些串槽espeak的,并读他们,但我得到“段错误”(I am trying to pas

2019-10-30 08:40发布

这是我的代码。 我想从用户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个输入)

但是,当我尝试安葬超过400个字符的输入,它提供了segmentation fault错误!

Answer 1:

这两个主要问题是:

  1. 您使用strlen字符未初始化的阵列上;
  2. 所述unique_identifier的参数espeak_Synth必须是NULL或指向一个unsigned int(参见源代码 ),而现在则是一个无符号指针随机存储器。

strlenscanf ,用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;
}


文章来源: I am trying to pass some strings trough espeak and it reads them but I get “segmentation fault”