分段错误处理 strcmp
Segmentation error handling strcmp
我有以下代码:
#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] = '[=10=]';
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] = '[=10=]';
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] = '[=10=]';
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
Segmentation fault (core dumped)
这个:
char *retrString = "RETR ";
是一个字符串字面量,也就是说这个指针指向的内存是只读的,所以不能是modified/written.
您的 "get" 部分在尝试修改该字符串文字时完全违反了上述内容:
strcat(retrString, operacion + 4);
strcat(retrString, "\r\n"); //>
retrString[strlen(retrString) - 1] = '[=11=]';
这会导致分段错误。
为了解决这个问题,只需声明char指针,然后为其分配space,填充它,然后随意修改它。
示例:
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] = '[=12=]';
我有以下代码:
#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] = '[=10=]';
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] = '[=10=]';
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] = '[=10=]';
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
Segmentation fault (core dumped)
这个:
char *retrString = "RETR ";
是一个字符串字面量,也就是说这个指针指向的内存是只读的,所以不能是modified/written.
您的 "get" 部分在尝试修改该字符串文字时完全违反了上述内容:
strcat(retrString, operacion + 4);
strcat(retrString, "\r\n"); //>
retrString[strlen(retrString) - 1] = '[=11=]';
这会导致分段错误。
为了解决这个问题,只需声明char指针,然后为其分配space,填充它,然后随意修改它。
示例:
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] = '[=12=]';