문제

정말로 혼동하는 경우 내 프로그램은 방식으로 행동 하니다.이제는 그냥 재미까지 예측 프로그램을 쓰고 있어요.

    char buffer[20];
    char team1_name[20];    // 18 chars + new line + null
    char team2_name[20];

    printf("Who is team 1?\n");
    fgets(buffer, sizeof(buffer), stdin);
    strncpy(team1_name, buffer, sizeof(team1_name));
    team1_name[strlen(team1_name) - 1] = '\0';

    printf("\nWho is team 2?\n");
    fgets(buffer, sizeof(buffer), stdin);
    strncpy(team2_name, buffer, sizeof(team2_name));
    team2_name[strlen(team2_name) - 1] = '\0';

    printf("\nEnter %s's info:\n", team1_name);

호기심에 나가 팀 이름을 입력하 20 보다 큰 문자와 그것을 완전히 건너뛰 두 번째 인쇄 문입니다.나는 이에 대하여 보호 buffer overflow?그것은 사용자가에 넣지 뭔가 큰?가 필요 flush 문?

이것은 출력:

    Who is team 1?
    wjefowiejfwoiejfweoifjweoifjweofijweoifj

    Who is team 2?

    Enter wjefowiejfwoiejfwe's info:
    Wins in last 12:

    Losses in last 12:

    Points per game:
도움이 되었습니까?

해결책

첫 번째 fgets (20 개 이상의 문자가 있음)에서 입력이 잘립니다. 두 번째 fgets는 stdin에서 첫 번째 입력 문자열의 끝을 읽을 것입니다.

"team2_name"값을 표시하여 볼 수 있습니다 (Team1_Name에서 20 개의 첫 번째 chars 이후의 문자가 포함되어 있습니다).

죄송합니다, 다음 의견이 잘못되었습니다.그것에 대해 잊어 버리십시오 : 그리고 예, fgets는 sizeof (버퍼) -1을 사용해야합니다.이 인수는 읽기의 최대 수입니다.따라서 sizeof (버퍼) 문자를 읽으면 sizeOf (버퍼) +1 문자 (후행 '\ 0'포함)

을 저장해야합니다.

다른 팁

을 읽는 20 자의 stdin 지만,나머지는 입력이 여전히 남아 있습니다.다음 fgets 를 읽고 그 남은 문자,그래서 Team1 라 wjefowiejfwoiejfwe 고 Team2 oifjweofijweoifj.인쇄 Team2 의 이름을 뿐만 아니라 당신이 볼 것이 사실이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top