2017-11-02 9 views
0

내 프로그램에 대한 테스트를하고 있었고 프로그램이 내 기능을 입력 할 때 왜 충돌하는지 궁금해하고있었습니다. 프로그램의 논리에 신경 쓰지 마라. 내가 지금 내 도구를 사용하는 방법을 이해하는 단계에 있었기 때문이다.문자 배열과 포인터에 관한 구문이 무엇이 있습니까?

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

/* Constants */ 
#define HEX_CAPITAL_LETTERS_BEGIN 65 
#define HEX_CAPITAL_LETTERS_END 90 
#define HEX_NUMBERS_BEGIN 48 
#define HEX_NUMBERS_END 57 
#define EXIT_SUCCES 0 

/* Prototypes */ 
void codeToField(char *charArray, int i, int hexFloor, int hexCeil, char *outputArray); 

/* Main Function */ 
int main(void) { 
    char *code, warehouse, product, qualifiers; 
    int i = 0; 

    printf("Enter a MMOC product code: "); 
    scanf("%s", &code); 

    codeToField(code, i, HEX_CAPITAL_LETTERS_BEGIN, HEX_CAPITAL_LETTERS_END, &warehouse); 
    codeToField(code, i , HEX_NUMBERS_BEGIN, HEX_NUMBERS_END, &product); 

    strcpy(&qualifiers, code + i); 

    printf("\n\nWarehouse: %s\nProduct: %s\nQualifiers: %s\n", &warehouse, &product, &qualifiers); 

    return EXIT_SUCCES; 
} 

void codeToField(char *charArray, int i, int hexFloor, int hexCeil, char *outputArray) { 
    int j = 0; 
    while (charArray[i] >= hexFloor && charArray[i] <= hexCeil) { 
    outputArray[j] = charArray[i]; 
    i++; 
    j++; 
    } 
} 

미리 감사드립니다.

+0

왜 'A', 'Z', '0'등 대신 '65'와 '90'같은 숫자를 사용합니까? – trentcl

+0

왜 'strcpy'를 하나의 문자로 만들려고합니까? –

+0

@ M.M 내가 말했듯이 손에있는 문제 이외에 아무 것도 신경 쓰지 마라. 아직도 내가 원하는 걸 찾아 내려고 노력하고 있었고, 실제로 테스트 해봤습니다. 문제를 제기 한 모든 것은 하하를 게시하기 전에 주석 처리되었습니다. –

답변

0
char *code, warehouse, product, qualifiers; 
    int i = 0; 

    printf("Enter a MMOC product code: "); 
    scanf("%s", &code); 

code 당신이 scanf 호출을 한 번, 그래서 프로그램이 묶였던 된 메모리에 초기화되지 않은 포인터이다. 다른

char *code, warehouse, product, qualifiers; 

유일한 포인터가 code이다는 단일 char 단지입니다

나는 당신이 뭔가 더

char code[100]; 
printf ("Enter a MMOC product code: "); 
scanf ("%s", code); 
+0

최대 배열 크기를 피할 수있는 방법이 있습니까? :) –

+0

예. https://stackoverflow.com/questions/16870485/how-can-i-read-an-input-string-of-unknown-length. 아니면 C++과 문자열을 사용하십시오. – QuestionC

+0

@MikeLundAndersen 또한 malloc을 사용하여 스택 대신 힙에 배열을 넣을 수 있습니다. – vicatcu

0

이유는 code에 할당 된 메모리가 없기 때문입니다. 그것은 초기화되지 않은 포인터입니다. 대신이 시도 : 여기

// ... 
char myString[16], *code, warehouse, product, qualifiers; 
code = &myString[0]; 
int i = 0; 

printf("Enter a MMOC product code: "); 
scanf("%15s", code); 
// ... 
+0

버퍼 오버플로를 피하기 위해 scanf 형식 문자열에 길이 제한기를 사용해야합니다. –

+0

'code'가'NULL'이 아닌 초기화되지 않았습니다. – Barmar

1

처음처럼, 이것은 당신이 원하는 일을하지 않습니다 싶은 생각합니다. printf으로 문자열을 인쇄하고 함수에 warehouseproductoutputArray으로 사용합니다. 그들은 포인터 (또는 배열)가되어야합니다.

char *code, *warehouse, *product, *qualifiers; 

그런 다음 기억이 필요합니다. 포인터는 아직 초기화되지 않았으므로 포인터는 정의되지 않은 동작입니다.

자동 저장 기간 (스택) 또는 동적으로 (힙에) 메모리를 할당 할 수 있습니다.

스택은 :

char codestr[100]; 
code = codestr; 

하지만, 당신은 또한 단지 code

char code[100]; 

로 두 변수를 가지고 피하기 위해 선언 할 수 있었다. 동적으로 메모리를 할당 할 경우

, 당신은 malloc 사용합니다 :

code = malloc(100); 

다시 메모리를 해제하는 것을 잊지 마세요 :

warehouse

free(code); 
, product, qualifiers 모든 메모리를 필요로 너무. 배열 크기 중 일부는 정의 된 상수로부터 추론 할 수 있습니다.