Передача строковой переменной в функцию, содержащую команду system () в C - PullRequest
0 голосов
/ 25 февраля 2019

Мне известны другие посты на эту тему.Но после просмотра всех из них, по-прежнему, возникает проблема для моего случая.

В настоящее время я работаю над функцией «Строка в речь», использующей Vbscript для преобразования строки в речь.(spraak.vbs) VBsript сохраняется в той же папке, что и код C.

Содержимое файла `VBscript с 1 аргументом

rem String to speech  
Set spkArgs = WScript.Arguments 
arg1 = spkArgs(0)
set speech =  Wscript.CreateObject("SAPI.spvoice") 
speech.speak arg1

Использование команды sprintf ()я объединил итоговую строку для команды system ().

sprintf(command, "cmd /c spraak.vbs \"Welcome\"");
system(command);

Код, используемый здесь, работает как брелок.Но когда я пытаюсь использовать переменную в качестве аргумента («Добро пожаловать»).Он только говорит «Пусто».

char text = "\"Welcome\""
sprintf(command, "cmd /c spraak.vbs %s", text);
system(command);

В чем может быть проблема?

Полный код C ниже:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Test\n");
    char text[] = "\"Welcome\"";
    char command[] = "";
    printf("%s\n", text);
         sprintf(command, "cmd /c spraak.vbs \"Welcome\"");
         system(command);
        sprintf(command, "cmd /c spraak.vbs %s", text);
        system(command);
    printf("Test2\n");
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

sprintf нужен уже выделенный буфер достаточного размера для помещения результата. Ваш char command[] = "", однако, является массивом символов длины 1 (только завершающий ноль), что слишкомshort, чтобы получить полный результат.

Вы можете попробовать использовать

char command[50];

.Обратите внимание, что в реальном приложении 50 должно быть определено соответствующим образом в соответствии с данными, которые будут сохранены.Для этого вы можете использовать snprintf вместо sprintf для вычисления требуемого размера буфера.

0 голосов
/ 25 февраля 2019

Проблема заключается в следующем:

char command[] = "";

Это создает массив из одного символа , и этот единственный символ является ограничителем строки '\0'.Это равно

char command[1] = { '\0' };

Когда вы используете sprintf, вы пишете вне границ, и у вас будет неопределенное поведение .

КомуДля решения этой проблемы используйте фиксированный размер массива и используйте snprintf, чтобы избежать переполнения буфера:

char command[128];
snprintf(command, sizeof command, "cmd /c spraak.vbs %s", text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...