2014-12-28 5 views
0

코드에 문제가 있습니다. 내 프로그램을 컴파일 한 후 분할 코드 오류가 발생합니다. 간단하게 다운로드 도구를 만들어서 가장 간단한 아이디어를 사용하고 싶습니다. (사용자가 URL과 프로그램 다운로드 파일을 사용자 데스크톱에 입력합니다). 이 프로그램을 작동시키는 방법이나 더 나은 결과로 더 많은 것을 요구하는 코드로 변환하는 방법에 대한 조언을 해줄 수 있습니까?간단하게 libcurl을 사용하여 menager를 Ubuntu에서 다운로드하십시오.

#define CURL_STATICLIB 
#include <stdio.h> 
#include <curl/curl.h> 
#include <string.h> 

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) 
{ 
    size_t written; 
    written = fwrite(ptr, size, nmemb, stream); 
    return written; 
} 

int main(void) 
{ 
    CURL *curl; 
    FILE *fp; 
    CURLcode res; 
    int x; 
    char y[200]; 
    char page; 
    char outfilename[FILENAME_MAX]; 
    char path_pdf = "/home/user_name/Desktop/document.pdf"; 
    char path_jpg = "/home/user_name/Desktop/picture.jpg"; 
    char path_txt = "/home/user_name/Desktop/document.txt"; 
    char FILEPATH[2] = {path_pdf, path_jpg, path_txt}; 
    printf("Enter file url \n"); // for example http://oi58.tinypic.com/15nk3de.jpg 
    scanf ("%s",y); 
    char *url = "y"; 
    printf("Choose type of file:\n [0] - pdf\n [1] - jpg\n [2] - txt\n "); //choose 1 
    scanf("%d",x); 
    outfilename[FILENAME_MAX] = FILEPATH[x]; 
    curl = curl_easy_init(); 
    if (curl) 
    { 
     fp = fopen(outfilename,"wb"); 
     curl_easy_setopt(curl, CURLOPT_URL, url); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 
     curl_easy_setopt (curl, CURLOPT_VERBOSE, 1L); 
     res = curl_easy_perform(curl); 
     curl_easy_cleanup(curl); 
     fclose(fp); 
    } 
    return 0; 
} 
+0

'char FILEPATH [2] = {path_pdf, path_jpg, path_txt};'. 해당 배열에는 3 개의 요소가 있고 2는 아니다. 또한 C의 문자열은'char'가 아닌'char *'유형이다. – RaptorDotCpp

답변

1

는 코드가 작동하지 않는 몇 가지 이유가 있습니다 :

  • path_pdf, path_jpgpath_txtchar*

  • FILEPATHchar FILEPATH[3] = {path_pdf, path_jpg, path_txt}; 뾰족한 RaptorDotCpp로 선언되어야 타입이어야 아웃.

  • 두 번째 scanf 전화는 scanf("%d", &x);이어야합니다. 왜냐하면 scanf는 포인터 형식으로 인수를 요구하기 때문입니다. 이것은 테스트 할 때 코드가 segfault 된 위치입니다.

  • urlchar *url = y;으로 초기화되어야합니다. 이렇게하면 url이 문자 "y"대신 사용자가 입력 한 값으로 설정됩니다.

  • outfilename[FILENAME_MAX] = FILEPATH[x];outfilename 끝을 씁니다. 대신 버퍼 오버플로가 발생하지 않는 outfilename = FILEPATH[x];을 사용하십시오.

+0

게시하기 전에이 "기본 사항"오류를 시정하지 않으셔서 죄송합니다. 이미지가 바탕 화면에 다운로드되어야 할 때까지 프로그램은 정상적으로 작동 할 때까지 정상적으로 컴파일됩니다. 아직 세그먼트 분할 오류가 발생합니다 (오류 : https://imgur.com/Y3ooOLC). – davoid

+0

문제가 해결되었습니다. – davoid