Как связать concat и вызвать System с помощью char var - PullRequest
2 голосов
/ 26 января 2012

я пытаюсь concatsomm строк и вызывать сценарий expext на моем сервере, но я программист .net и плохо знаком с c и указателями, так что продолжайте портить ... что я тут делаю не так?

или лучше спросить: как мне на самом деле это сделать?

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

int main(int argc, char *argv[])
{
    //location of expect script that ssh and gets info on other server
    char str0[] = "./home/systemio/Develop/getfile ";

    char* strP =  argv[1];
    char str1 = (char)*strP;
    char str2[] = " > file.txt";

    strcat(str0,str1);

    strcat(str0,str2);

    printf("%s\n", str0);
    system(str0);

    printf("Done!!!!\n");
    return 0;
}

Ответы [ 3 ]

4 голосов
/ 26 января 2012

Эта строка не будет работать:

strcat(str0,str1);

Это потому, что str1 не строка!Это один char.Строки могут быть только символами-указателями или массивами символов.

И, как отмечали другие, str0 недостаточно велик, поэтому вы перезапишете память, что приведет к неопределенному поведению .

Если я могу дать альтернативное решение того, что вы пытаетесь сделать:

char str[100];

sprintf(str, "./home/systemio/Develop/getfile %c > file.txt", argv[1][0]);
printf("%s\n", str);
system(str);

Редактировать: Объяснение, почему я использую argv[1][0]

Причина в том, что эти две строки в вопросе:

char* strP =  argv[1];
char str1 = (char)*strP;

Эти две строки получают первый символ из argv[1] косвенным образом.Если вам нужно все argv[1], тогда мои sprintf будут выглядеть так:

sprintf(str, "./home/systemio/Develop/getfile %s > file.txt", argv[1]);
2 голосов
/ 26 января 2012

Вы можете выделить буфер для системной команды, чтобы обеспечить достаточно места для создания полной команды:

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

int main(int argc, char* argv[])
{
    /* Ensure 1 argument supplied. */
    if (2 == argc)
    {
        /* malloc()ing the system command buffer means you can safely
           edit 'util' and 'output' without being concerned about the
           size of an array.
           The '+2' is for the char from argv[1]
           and for the terminating null character. */
        const char* util   = "./home/systemio/Develop/getfile ";
        const char* output = " > file.txt";
        char* str0         = malloc(strlen(util) + strlen(output) + 2);

        if (str0)
        {
            if (sprintf(str0, "%s%c%s", util, *argv[1], output) > 0)
            {
                printf("%s\n", str0);
                system(str0);
                printf("Done!!!!\n");
            }

            /* free() malloced memory. */
            free(str0);
        }
    }

    return 0;
}
1 голос
/ 26 января 2012

Конкатенация в C не такая, как в Java или C #.(Вы не можете сделать «A» + «B» и получить «AB»)

Чтение: http://cplusplus.com/reference/clibrary/cstring/strcat/

strcat (dest, src)

Вам необходимо зарезервировать место в месте назначения, чтобы убедиться, что добавленная строка помещается в переменную назначения.(должен иметь сначала «A», затем скопировать «B»).

Я предпочитаю strcpy

...