2016-09-16 2 views
1

나는 C로 빠른 프로그램을 만들려고 노력하고있다. 사용자가 몇 가지 질문과 가능한 대답을 먼저 정의한 다음 프로그램에서 질문합니다. 최종판에서 답이 맞다면 다음 질문이 나오고 그렇지 않으면 프로그램이 끝납니다.C 프로그래밍의 초보자 - 문자열 지정에 붙이기

이것은 내가 거기까지 갔을 때 모든 것이 정확하다는 것을 확신하지 못합니다. (나는 정의 된 각 변수에 대해 어떤 크기를 할당해야하는지 혼란 스럽습니다. 확실한 이유는!).이 프로그램은 '당신이 할 수있는, 3 질문 (이)가 제대로 표시되지 않습니다. 누군가가 조언을 주실 질문 할 때? 이상하게 동작

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

struct Quest { 
char title[255]; 
char option1[255]; 
char option2[255]; 
char answer[5]; 
}; 



int main() { 
int i; 
char name[255]; 
char user_answ[5]; 
struct Quest Question[2];  

for(i=0; i<3; i++) 
{ 
    printf("Enter q%d title:\n", i+1); 
    fgets(Question[i].title,sizeof(Question[i].title),stdin); 

    printf("Enter q%d option1:\n", i+1); 
    fgets(Question[i].option1,sizeof(Question[i].option1),stdin); 

    printf("Enter q%d option2:\n", i+1); 
    fgets(Question[i].option2,sizeof(Question[i].option2),stdin); 

    printf("Enter q%d answer:\n", i+1); 
    fgets(Question[i].answer,sizeof(Question[i].answer),stdin); 

} 

/* Ask Name */ 
printf("What is your name?\n"); 
fgets(name,sizeof(name),stdin); 

printf("Hi %s! \n",name); 
for(i=0; i<3; i++){ 

printf("%s\n", Question[i].title); 
printf("1: %s\n", Question[i].option1); 
printf("2: %s\n", Question[i].option2); 
printf("Please enter your answer\n"); 
fgets(user_answ,sizeof(user_answ),stdin); 
printf("Your answer is %s\n",user_answ); 
printf("The right answer is %s\n",Question[i].answer); 

} 

return 0; 
} 

답변

1
struct Quest Question[2]; 

당신은 두 질문의 배열을 가지고 t 채우기 및 표시 3

3을 변경하십시오.

당신은

변수 이름을 확인 컴파일러 말처럼이 볼 수있는 것이 조금 단순화 물론

유형 구조체 퀘스트 2 변수를 포함 질문 , 당신은 변수가 필요하다는 것을 이해할 수 있습니다.

+0

감사합니다. @ blue112, 좋은 시작입니다. :) – user2475110

2

세 가지 질문에 대한 입력을 원하고 세 가지 질문을 출력합니다. 그러나 에 대한 배열을 만들 때는 두 개의 배열을 만듭니다.

배열을 만들 때 대괄호 ([])의 값은 배열의 요소 수이며 맨 위 인덱스는 아닙니다.

이제 배열의 범위를 벗어나서 정의되지 않은 동작이 발생합니다.

+0

감사합니다. @ joachim-pileborg 좋습니다. 내 두 변수 anwer 및 user_answer와 동일한 문제입니까, 가장 적합한 크기는 무엇입니까? "1"또는 "2"로되어 있지만 char 응답 [1]을 사용하면 이상하게 작동합니다. 또한 항목의 유효성을 검사 할 때 user_answer와 답변을 비교하는 방법은 무엇입니까? – user2475110

+0

@ user2475110 C의 문자열은 * 종료되어야 함을 기억하십시오. 따라서 단일 문자의 문자열에는 두 개의 요소로 이루어진 배열이 필요합니다. 하나는 문자열의 문자 용이고 다른 하나는 종결 자용입니다. 5 개의 문자가 포함 된 문자열에는 여섯 개의 요소로 된 배열이 필요합니다. –

+0

그래서 이론상 ** anwer **와 ** user_answer **는 가능한 한 하나의 문자만을 기대하기 때문에 크기는 2 여야합니다. 문제는 프로그램이 4보다 낮은 숫자를 선택하면 이상하게 작동한다는 것입니다. – user2475110

3
struct Quest Question[2]; 

이 글을 쓰면서 2 명의 멤버가있는 구조의 배열을 만들었습니다. 그들은 Question[0]Question[1]으로 식별됩니다. 그러나 i = 0에서 i = 2로 루프를 실행하면 Question[2]을 사용할 수 없습니다.

쓰기 : for(i=0; i<2; i++). 루프는 이제 i = 0 및 i = 1에 대해서만 실행됩니다.

+0

감사합니다. @najat 좋은 시작입니다. 내 두 변수 anwer 및 user_answer와 동일한 문제입니까, 가장 적합한 크기는 무엇입니까? "1"또는 "2"로되어 있지만 char 응답 [1]을 사용하면 이상하게 작동합니다. 또한 항목의 유효성을 검사 할 때 user_answer와 답변을 비교하는 방법은 무엇입니까? - – user2475110

+1

'if (strcmp (user_answ, Question [i] .answer) == 0) { "... 그들은 일치합니다 ...")' –