これは私のコードです。ユーザーから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は言う:こんにちは
ユーザー入力:1つ
espeakは言う:1つ
(5入力用)
しかし、入力として4文字を超えてインターリングしようとすると、segmentation fault
エラーが発生します。
2つの主な問題は次のとおりです。
strlen
初期化されていないcharの配列で使用します。unique_identifier
引数はunsignedint(ソースコードを参照)でespeak_Synth
あるNULL
か、それを指している必要がありますが、現在はランダムメモリへのunsignedポインタです。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;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加