Почему следующий код вызывает ошибку сегментации?

0

Я пытаюсь выполнить команду UNIX через мою программу, которая будет обрабатывать до 4 аргументов, почему это либо приводит к ошибке seg, либо другим ошибкам?

using namespace std;

int main() {

char buffer[255];
cin >> buffer;


char* firstPtr;
char* secondPtr;
char* thirdPtr;
char* fourthPtr;

firstPtr = strtok(buffer, " ");
secondPtr = strtok(NULL, " ");
thirdPtr = strtok(NULL, " ");
fourthPtr = strtok(NULL, " ");


execlp(firstPtr, secondPtr);


   return 0;
}
  • 0
    Потому что вы вызываете неопределенное поведение? (или ты уже знал это)? cin >> buffer разрывается на пробельных, так tokenizing это на " " спорно. поэтому secondPtr NULL, и вы счастливо secondPtr в UB-страну.
  • 0
    "или другие ошибки?" Какие еще ошибки?
Показать ещё 2 комментария
Теги:
segmentation-fault
strtok

3 ответа

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

Крушение происходит из-за buffer буфера.

Попробуйте использовать std::cin.getline(buffer, sizeof(buffer)) вместо std::cin >> buffer
Также обратите внимание, что strtok может возвращать NULL, поэтому убедитесь, что вы его обрабатываете.

  • 0
    Его буфер составляет 255 символов, и это приведет к ошибке ./prog ab .
  • 0
    @WhozCraig Я попробовал это на моем компьютере, и сбой происходит только при переполнении буферов.
Показать ещё 3 комментария
1

Если вы проверите man-страницу execlp, вы заметите, что первый аргумент (второй параметр для метода, параметр arg0) является обязательным, в дополнение к любым другим параметрам вы можете перейти к функции через переменные параметры - и это также упоминается в тексте, что

Список аргументов должен быть прерван указателем NULL.

Первый аргумент (secondPtr в вашем случае) должен быть именем исполняемого файла; так что вы нарушаете соглашение, перейдя сюда в NULL (из-за cin >> другие уже указали).

Но, кроме того, в конце вы также пропускаете по крайней мере еще один аргумент, который должен быть NULL.

Поэтому рекомендуется изучать страницы руководства!

1

Я думаю, вы должны использовать

char buffer[255];
cin.getline(buffer, 255);

В противном случае ваш второй, третий и четвертый указатели будут пустыми.

Ещё вопросы

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