2012-03-26 2 views
0

음식 주문에는 물고기, 칩, 음료의 세 가지 유형이 있습니다. 사용자는 그들이 주문 원하는 것을 다음과 같이 질문에 대한 템플릿이 때문이다하라는 메시지가 표시됩니다 :조건에 따라 C 문자열의 데이터를 선언하고 변경 하시겠습니까?

Do you order ___ (Y/N)? - 
___ choice (food options): 
What size (L-Large, M-Medium, S-Small): 
How many orders do you want? (>=0): 
You ordered ___ SIZE:  order number: subtital: $x.xx 

은 그래서 사용자의 입력을 기반으로, 그것은 생선, 칩, 또는 음료가 될 것입니다. 그들이 비록 처음 낚시를하려는 경우 프로그램 FIRST는 묻는다, 그래서 (및 작동)이했던 방법은 다음과 같다 :

main() { 
    question("fish"); 
} 

질문 기능 (어떤 메신저에 문제가 가짐) :

void question (char choice[]) { 

    char choiceYesNo; 
    char foodChoice[]; 
    char foodOptions[]; 

    switch (choice[0]) { 
    case 'f': 
     foodChoice[] = "fish"; 
     foodOptions[] = "(K - Haddock, T - Halibut)"; 
     break; 
    case 'c': 
     // options for chips 
     printf("Do you order CHIPS? (Y/N): \n"); 
     break; 
    case 'd': 
     // options for drinks 
     printf("Do you order DRINK? (Y/N): \n"); 
     break; 
    } 

    printf("Do you order %c? (Y/N): \n", toupper(foodChoice)); 
     scanf("%c", choiceYesNo); 
    printf("%c choice %c: \n", foodChoice, foodOptions); 
     scanf("%c", foodSelect); 
    printf("What size (L - Large, M - Medium, S - Small): \n"); 
     scanf("%c", foodSize); 
    printf("How many orders do you want? (>=0): \n"); 
     scanf("%c", foodOrders); 
    printf("You ordered %c: %c - SIZE: %c amount ordered: %d, subtotal price: %.2lf\n", toupper(foodChoice), foodSize, foodOrders, foodSubtotal); 

} 

을 내 질문 기능에서 작동하는 부분은 스위치가 f, c 또는 d를 선택하는 부분입니다. 내가 이해하지 못하는 것은 그것이 f를 고를 때 푸드 선택을 "물고기"로, foodOptions을 그 음식을 기반으로하는 올바른 옵션으로 설정해야합니다. 그렇게 거대한 printf를 사용하지 않고 수동으로 스위치를 사용하면 시간과 노력을 절약하고 변수를 사용하여 입력 할 수 있지만 작동하지는 않습니다. P 그러면 나중에 사용자 입력을 처리 할 포인터를 사용해야합니다.

감사합니다.

답변

1

을, 당신은 할당 할 필요가 없습니다 모든 메모리, 그냥 char *를 사용하여 음식 선택. 과제와 과제 만이 방법으로 작동합니다. strncpy 또는 memcpy를 사용하여 문자열을 연결해야합니다. 이를 위해서는 정적 또는 동적으로 할당 된 버퍼가 필요합니다.

또한 컴파일러는 컴파일시에 배열의 정확한 크기를 알고 있기 때문에 당신이

char array[]; 
array = "string"; 

을 할 수 없습니다. 후자가 들어 사실

char array[7] = { 's', 't', 'r', 'i', 'n', 'g', '\0'}; 

에 사실

char array[7] = "string"; 

에 있기 때문에 당신이 할 수있는 유일한 방법은,

char *string; 
string = "string"; 

또는

char array[] = "string"; 

입니다 배열 대 포인터 확인에 대한 자세한 내용 arrays vs pointers.

1

당신은 메모리 할당 누락 올바르게 선택 문자열 복사되지 않습니다 정확히 이런 식으로 (인수 리터럴 문자열) 질문을 호출하려는 경우

char foodChoice[1024]; // or dynamically: 
char *foodOptions = malloc(1024); 

switch (choice[0]) { 
case 'f': 
    strcpy(foodChoice, "food"); 
    strcpy(foodOptions, "(K - Haddock, T - Halibut)"); 
    break; /* ... */ 
+1

"문자열"에는 % s을 사용하고 char에는 % c 만 사용하는 것을 잊지 마십시오. –

+0

@ToddMurray 감사합니다! – eveo

관련 문제