Обработка ошибок сегментации strcmp - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть следующий код:

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

#define RCVBUFSIZE 1024

void insertarOperacion(char *op){
        char operacion[RCVBUFSIZE], *retrString = "RETR "; //<
        bool operacionError = false;

        printf("Para solicitar un fichero escriba get <nombreFechero>, para salir escriba quit\n");
        do{
            if(operacionError)
                printf("Opcion invalida\n");
            printf("Operacion: ");
            fgets(operacion, sizeof(operacion), stdin);
            operacion[strlen(operacion) - 1] = '\0';
            operacionError = true; printf("000000000\n");
        } while( ((strcmp(operacion, "quit") == 0) + (strncmp(operacion, "get", 3) == 0)) != 1);
        printf("111111111\n");
        if (strcmp(operacion, "quit") == 0){
            strcpy(operacion, "QUIT\r\n");
            operacion[strlen(operacion) - 1] = '\0';
            strcpy(op, operacion);
        }
        else if(strncmp(operacion, "get",3) == 0){printf("DALEEEKLAJDSFK");
            strcat(retrString, operacion + 4);printf("33333333333\n");
            strcat(retrString, "\r\n"); //>
            retrString[strlen(retrString) - 1] = '\0';
            printf("333333333334\n");
            strcpy(op, retrString);
            printf("333333333335\n");
        } printf("PORFI?");
    //  send(clientSock, retrString, RCVBUFSIZE, 0);
}
int main(){

    //int i = 10, j=20;
    char jiji[RCVBUFSIZE] = "lkajsdfkjdsf";
    insertarOperacion(jiji);
    printf("%s\n\n", jiji);
    insertarOperacion(jiji);
    printf("%s", jiji);



return 0;
}

Проблема в том, что раздел "выход" работает отлично. Раздел «получить» не работает. Если я введу, например, «get rekt.txt». Я получил следующий вывод:

000000000

111111111

Ошибка сегментации (ядро сброшено)

1 Ответ

0 голосов
/ 28 апреля 2018

Это:

char *retrString = "RETR ";

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

Ваш раздел "get" нарушает в точности указанное выше, когда пытается изменить строковый литерал:

strcat(retrString, operacion + 4);
strcat(retrString, "\r\n"); //>
retrString[strlen(retrString) - 1] = '\0';

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

Чтобы обойти эту проблему, просто объявите указатель на символ, затем выделите для него место, заполните его и затем измените его по желанию.

Пример:

char* retrString = NULL;
retString = malloc(sizeof("RETR ") * sizeof(char) + 1); // +1 for the null terminator
strcpy(retrString, "RETR ");
// do your get thing then
strcat(retrString, operacion + 4);
strcat(retrString, "\r\n"); //>
retrString[strlen(retrString) - 1] = '\0';
...