【问题标题】:I am trying to pass some strings trough espeak and it reads them but I get "segmentation fault"我试图通过 espeak 传递一些字符串并读取它们,但我得到“分段错误”
【发布时间】:2018-05-26 02:33:15
【问题描述】:

这是我的代码。我想从用户那里得到 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 错误!

【问题讨论】:

  • 段错误发生在哪里?
  • @lxop:当我尝试嵌入超过 4 个字符时

标签: c++ string input segmentation-fault espeak


【解决方案1】:

两个主要问题是:

  1. 您在未初始化的字符数组上使用strlen
  2. espeak_Synthunique_identifier 参数必须是 NULL 或指向无符号整数(参见 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;
}

【讨论】:

  • 你能告诉我哪些行没用吗?
  • 基本上所有带有这些讨厌变量的行。我添加了一个代码示例供参考。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多