2014-11-17 9 views
-1

두 문자열을 C 프로그래밍으로 결합하는 데 어려움이 있습니다. 명령 줄 매개 변수에서 입력 파일 이름을 가져올 수 있으며 출력 파일 이름에 .out을 추가 할 수 있기를 원합니다. 새 이름을 파일로 저장합니다. 예 : Test1.txt ->Test1.txt.outC 프로그래밍에서 두 문자열을 하나로 결합하십시오.

아래 코드는 알 수없는 이유로 분류 오류를 생성합니다. 전체 코드

int main(int argc, char** argv) 
{ 
    char fileName_Out[200]; 
    Consortium *con1; 
    int i; 

    for(i=0; i<argc; i++) 
    { 
     strcpy(fileName_Out, argv[i]); 
     strcat(fileName_Out, ".out"); 
     con1 = readConsortium (argv[i]); 
     writeNetWorth (fileName_Out, con1); 
    } 


    free(con1->core); 
    free(con1->associate); 
    free(con1); 
    con1->core = NULL; 
    con1->associate = NULL; 
    con1 = NULL; 

    return 0; 
} 

업데이트 :

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

typedef struct { 
    char code[4]; 
    float sharePrice; 
    int shares; 
    float assetValue; 
    float debts; 
} Company; 

typedef struct { 
    int numCore; 
    int numAss; 
     Company* core; 
     Company* associate; 
} Consortium; 

Consortium *readConsortium (char* fileName) { 

    Consortium *con1 = (Consortium*)malloc(sizeof(Consortium)); 
    int i; 
    FILE *source_f = fopen(fileName, "r"); 

    if(source_f == NULL) 
    { 
     con1 = NULL; 
    } else { 

    fscanf(source_f, "%d %d", &(con1->numCore), &(con1->numAss)); 

    con1->core = (Company*)malloc(sizeof(Company)*(con1->numCore)); 
    con1->associate = (Company*)malloc(sizeof(Company)*(con1->numAss)); 

    for(i = 0; i < con1->numCore; i++) 
    { 
     fscanf(source_f, "%s %f %d %f %f", con1->core[i].code, &con1->core[i].sharePrice, &con1->core[i].shares, &con1->core[i].assetValue, &con1->core[i].debts); 
    } 

    for(i = 0; i < con1->numAss; i++) 
    { 
     fscanf(source_f, "%s %f %d %f %f", con1->associate[i].code, &con1->associate[i].sharePrice, &con1->associate[i].shares, &con1->associate[i].assetValue, &con1->associate[i].debts); 
    } 

    } 

    fclose(source_f); 

    return con1; 
} 

void writeNetWorth (char* fileName_Out, Consortium *con) 
{ 
    int i; 
    float netWorth; 
    FILE* target_f = fopen(fileName_Out, "w"); 

    for(i = 0; i < con->numCore; i++) 
    { 
     netWorth = (con->core[i].sharePrice * con->core[i].shares) + con->core[i].assetValue - con->core[i].debts; 
     fprintf(target_f, "%s:%12.2f\n", con->core[i].code, netWorth); 
    } 

    for(i = 0; i < con->numAss; i++) 
    { 
     netWorth = (con->associate[i].sharePrice * con->associate[i].shares) + con->associate[i].assetValue - con->associate[i].debts; 
     fprintf(target_f, "%s:%12.2f\n", con->associate[i].code, netWorth); 
    } 

    fclose(target_f); 
} 

/* int main(void) 
{ 
    char fileName[200]; 
    char fileName_Out[200]; 
    Consortium *con2; 

    scanf("%s %s", fileName, fileName_Out); 

    con2 = readConsortium (fileName); 
    writeNetWorth (fileName_Out, con2); 

    free(con2->core); 
    free(con2->associate); 
    free(con2); 
    con2->core = NULL; 
    con2->associate = NULL; 
    con2 = NULL; 
    return 0; 
}*/ 

int main(int argc, char** argv) 
{ 
    char fileName_Out[200]; 
    Consortium *con1; 
    int i; 

    for(i=1; i<(argc+1); i++) 
    { 
     strcpy(fileName_Out, argv[i]); 
     strcat(fileName_Out, ".out"); 
     con1 = readConsortium (argv[i]); 
     writeNetWorth (fileName_Out, con1); 
    } 


    free(con1->core); 
    free(con1->associate); 
    free(con1); 
    con1 = NULL; 

    return 0; 
} 
+2

'gdb'를 사용하여 충돌이 발생한 위치와 이유를 파악합니다. – Rohan

+0

'con1'은 자유로 웠던 후에'->'를 통해 접근합니다. 그러지 마세요.그냥 'con1 = NULL;'이면 충분합니다. –

+1

argv [0]는 프로그램의 이름이므로 아마 argv [1]로 시작하고 싶을 것입니다. – JS1

답변

1

두 가지.

  1. fileName_Out[200]을 사용하는 동안 메모리가 부족하지 않습니까? man pagestrcat()

    인 경우 dest 문자열에는 결과를위한 충분한 공간이 있어야합니다. dest가 충분히 크지 않으면 프로그램 동작을 예측할 수 없습니다.

  2. 당신은 당신이 보여준 코드에서 con1 포인터에 메모리를 할당하는 것 적이 없다. [우리는 readConsortium() 정의를 보여주지 않았다는 것을 고려해보십시오].

  3. 난 당신과 같이 con1-> ..을 -ing free 자제해야한다고 생각 당신의 main() con에 대한 할당이 없습니다.


편집 :

귀하의 문제는 코드에서 다른 곳이었다

. for 루프 지정이있는 경우

for(i=1; i<(argc+1); i++) 

범위가 부족합니다.

for(i=1; i<argc; i++). 

Remenber에 해당 조건을 변경, 배열의 n 번째 요소는 항상 n-1의 인덱스를해야합니다.

+0

con1은 writeNetWorth 함수 내에서 메모리를 할당받습니다. strcat 및 strcpy 함수를 제거해도 segfault가 표시되지 않으면 입력 파일 이름의 길이가 99보다 짧습니다. – IamTrent

+0

@IlTrent 질문에 해당 함수를 포함해야합니다. 대답 해주세요. 대부분 버그는 그 기능 내에 있습니다. – Lundin

+0

나머지 함수는 strcpy와 strcat을 제거 할 때 올바르게 작동하므로 문제가되는 것은 의심 스럽습니다. 나는 그들을 어쨌든 포함시킬 것이다. – IamTrent

0

나에게는 con1이 NULL이되는 것처럼 보이지만 NULL을 확인하지 않고 writeNetWorth에서 해당 포인터를 사용하려고합니다. 사기꾼이 NULL 인 경우

for(i = 0; i < con->numCore; i++)

는 segfault의 원인이됩니다.

con1이 NULL이되는 이유는 "argv [0] .out"에서 얻은 yourprogram.exe.out을 열 수 없다는 것입니다.

보조 노트로 프로그램에 메모리 누수가있는 것처럼 보이며 동일한 루프에서 메모리를 해제하지 않고 루프에 동적으로 메모리를 할당하는 것처럼 보입니다.