ошибка сегментации в простой программе командной строки

0

Я пытаюсь создать простую программу, которая вызывает cat с system() в местоположении файла, введенном в качестве аргумента команды. Но я получаю ошибку сегментации (ядро сбрасывается) каждый раз, когда я вызываю файл. Не могли бы вы проверить, почему (я не вижу нигде в своей программе, я делаю что-то с памятью, чтобы получить эту ошибку!).

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

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        printf("usage: %s filename", argv[0]);
    }
    else
    {
        printf("commad: %s", strcat("cat ", argv[1]));
        system(strcat("cat ", argv[1]));
    }
    return 0;
}
  • 1
    Поведение строкового литерала не определено.
  • 0
    не могли бы вы объяснить
Показать ещё 1 комментарий
Теги:
segmentation-fault

3 ответа

3
Лучший ответ

Вы не можете изменять строковые литералы, такие как "cat " они обычно хранятся в сегменте только для чтения в памяти, когда загружается ваш исполняемый файл, а когда вы пытаетесь его модифицировать, вы получите ошибку сегментации, о которой вы просили объяснить.

Вместо этого используйте std::string, это более идиоматический способ C++:

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

#include <string>

int main(int argc, char *argv[]) {    
    if(argc != 2) {
        printf("usage: %s filename", argv[0]);
        return 0;
    } else {
        std::string command("cat ");
        command += argv[1];
        printf("command: %s", command.c_str());
        return system(command.c_str());
    }
}

Объект std::string будет распределять память динамически по мере необходимости, чтобы разместить дополнительные символы, которые вы добавляете к нему. Однако, если вы хотите продолжить использование C-строк, вам нужно будет управлять символьным буфером явно:

char *buffer = static_cast<char*>(malloc(5 + strlen(argv[1])));
strcpy(buffer, "cat ");
strcat(buffer, argv[1]);
printf("command: %s", buffer);
// ...
free(buffer); 
2

В ваших strcat вы пытаетесь изменить строковый литерал "cat", который является неопределенным поведением. Первым аргументом strcat должен быть буфер, в котором вы можете писать, а не строковый литерал.

2

Вы используете strcat неправильно. Вам необходимо указать буфер назначения.

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

int main(int argc, char *argv[])
{
        if(argc == 2) {
             char[20] c = "cat";
             strcat(c, argv[1]);
             printf("commad: %s", c);
             system(c);
        }
        else {
            printf("usage: %s filename", argv[0]);
        }

        return 0;
}

ИЛИ не конкатенировать

printf("commad: %s%s", "cat ", argv[1]);
  • 0
    +1 за обнаружение вашей ошибки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню