我正在尝试通过说话传递一些字符串,它会读取它们,但我得到了"segmentation fault"

I am trying to pass some strings trough espeak and it reads them but I get "segmentation fault"

本文关键字:读取 fault segmentation 字符串      更新时间:2023-10-16

这是我的代码。我想从用户那里获得5个字符串,并在用户互化时读取每个字符串。但是我收到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错误!

两个主要问题是:

  1. 您在非初始化的字符阵列上使用 strlen;
  2. espeak_Synthunique_identifier参数必须为NULL或指向未签名的INT(请参阅源代码),而现在它是一个无符号的指针。

scanf之后移动strlen,使用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;
}