2014-12-08 2 views
-1

Im пытается создать два пути, чтобы скопировать файл из одной папки в другую. Я получаю ошибку сегментации во второй раз, когда я пытаюсь объединить аргументы [1]. Пробовал скопировать ячейку на другой символ с помощью strcpy, но это не помогло бы. и многое другое, с которым я не справился. Я думаю, что что-то с этими строковыми командами возится с моим массивом char и не позволяет мне делать concat twise. путь должен иметь вид «Сервер/Файл №» или «Клиент №/Файл №» # является аргументом из args. Я все посмотрел и увидел похожие вещи, но не совсем так. прошу помочь.concating char * in c не удается выполнить segmentation fault

все необходимые «включить» находятся там.

void copy_file(char *args[]){ 
char dst_path[100],src_path[100]; 

memset(dst_path,0,100); 
memset(src_path,0,100); 

strcpy(dst_path,"Client"); 
strcat(dst_path,args[0]); 
strcat(dst_path,"/File"); 
strcat(dst_path,args[1]); 

strcpy(src_path,"Server/File"); 
strcat(src_path,args[1]); 
} 
+0

Также 'i' никогда не объявляется, и вы должны действительно использовать memset. – Martin

+1

сделал оба ... еще не решение .. –

+1

Боковое примечание: факт, что вы начинаете с 'strcpy', делает вызов' memset' излишним. И, кстати, вы можете также установить их при объявлении (по производительности он будет более или менее таким же, как вызов 'strcpy', но по коду он будет более чистым). –

ответ

0

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

Кроме того, вы не проверяете количество элементов в массиве args[]. Может быть меньше аргументов, чем вы ожидаете, вероятно, args[1] - NULL.


Чтобы исправить:

  1. Проверьте количество элементов в массиве args[].

  2. Рассчитайте необходимый размер буфера для окончательной строки, выделите буфер такого размера и затем отформатируйте строку. Кроме того, используйте snprintf для форматирования строки в один вызов. snprintf ли связан чеки для вас, так что вы не переполнить буфер вашего назначения, например:

    char dst_path[16384]; 
    int n = snprintf(dst_path, sizeof dst_path, "Client %s /File %s", args[0], args[1]); 
    if(n >= sizeof dst_path) 
        // dst_path is not large enough 
    
+0

эй, в предвыборном издании qeustion, буфер был в размере, который должен быть, но люди здесь сказали мне, что это происходит. поэтому я расширил его. Я проверяю snprintf прямо сейчас. –

0

Надеюсь, вы можете собрать из этого, где у вас есть СУИ-ступенчатые. Протестировано с помощью GCC 4.8.3. Долгий и короткий - это то, что вы переполняете свой буфер.

/* gcc -g -Wall -Wextra main.c */ 
#include <assert.h> 
#include <string.h> 

#define BUFSIZE 30 

void copy_file(char* args[]) { 
    char dst_path[BUFSIZE]; 
    char src_path[BUFSIZE]; 
    int i; 

    for (i = 0; i < 30; i++) { //initializing - tried without it too. 
    dst_path[i] = 0; 
    src_path[i] = 0; } 

    assert(strlen(dst_path) + strlen("Client") < BUFSIZE); 
    strcpy(dst_path, "Client"); 
    assert(strlen(dst_path) + strlen(args[0]) < BUFSIZE); 
    strcat(dst_path, args[0]); 
    assert(strlen(dst_path) + strlen("/File") < BUFSIZE); 
    strcat(dst_path, "/File"); 
    assert(strlen(dst_path) + strlen(args[1]) < BUFSIZE); 
    strcat(dst_path, args[1]); 

    assert(strlen(src_path) + strlen("Server/File") < BUFSIZE); 
    strcpy(src_path, "Server/File"); 
    assert(strlen(src_path) + strlen(args[1]) < BUFSIZE); 
    strcat(src_path, args[1]); } 

int main(int argc, char* argv[]) { 
    copy_file(&argv[1]); 
    return 0; } 
+0

Вам не нужно инициализировать целые буферы нулями. Только первый элемент. –

+0

@MaximYegorushkin, true. Я минимизировал изменения в коде. –

+0

Напоминает мне: «Это не моя ошибка, я скопировал код». –

0

Одна из главных причин, вы имеющие переполнение буфера, скорее всего, это ваше использование strcpy. Это не имеет фиксированной длины копии, и, таким образом, если ваши строки не будут завершены символом NULL, то будет скопирована и память \0, которая не является частью строки. То, что вы должны использовать, - strncpy; то вы можете использовать strlen, чтобы получить длину строки после добавления завершающего символа NULL. Хорошей практикой является всегда устанавливать последний символ вашего буфера в NULL после его записи.