Member 13376650 Ответов: 2

Я пытаюсь передать некоторые строки через espeak, и он читает их, но я получаю “ошибку сегментации”


Это мой код. Я хочу получить 5 строк от пользователя, и espeak читает каждую из них, когда пользователь ее закапывает. Но я получаю сообщение " ошибка сегментации(ядро сброшено)`.



#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;
 }


Что я уже пробовал:

Я попробовал некоторые модификации, но ни одна из них не сработала. Я хочу, чтобы программа работала вот так:

> ввод пользователя: привет
>
> эспик говорит: Привет
>
> пользовательский ввод: один
>
> эспик говорит: один
>
> (Для 5
> входы)

Но когда я пытаюсь вставить более 4 символов в качестве входных данных,это дает ошибку " ошибка сегментации`!

2 Ответов

Рейтинг:
2

Richard MacCutchan

scanf("%s ", &text);

Не используйте оператор addressof для получения адреса массива, просто введите имя массива таким образом:
scanf("%s ", text);


Рейтинг:
1

Rick York

Кроме того, вызов strlen должен быть перемещен внутри цикла :

for (i=0; i<5; i++)
{
    scanf( "%s", text );       // I don't think it needs the trailing space
    printf("%s", text);
    size = strlen(text)+1;     // <-- moved this line inside loop
    espeak_Synth( text, size, position, position_type, end_position, flags,
                  unique_identifier, user_data );
    espeak_Synchronize();
    fflush(stdout);
}