2016-11-03 2 views
1

작은 작업자 등록부를 만들려고 시도했지만 주소 값을 얻는 두 번째 scanf를 완전히 건너 뜁니다. 나는 초보자이기 때문에 내가 뭘 잘못하고 있는지 모른다. 다음은 코드입니다.scanf를 건너 뛰었습니다 (?)

#include <stdio.h> 

int main() 
{ 
    // var 
    char n[256], ad[256]; // n - Name, ad - Address 
    int i, ag; // i - Income, ag - Age 
    // code 
    printf("Welcome to the Worker Register\n\nWorker Data\n\nName: "); 
    scanf("%255[^\n]", n); 
    printf("Address: "); 
    scanf("%255[^\n]", ad); 
    printf("Age: "); 
    scanf("%d", &ag); 
    printf("Income: R$"); 
    scanf("%d", &i); 
    printf("Worker %s\nAddress: %s\nAge: %d\nIncome: R$%d", n, ad, ag, i); 
    return 0; 
} 

정말로 도움을 주셔서 감사합니다.

답변

1

나드의 해킹,하지만 난 당신이라면 나는 문자열을 읽을 수는 scanf를 사용하지 않을 것입니다.

대신 문자열을 읽는 fgets()를 사용하는 것이 좋습니다. 문자열에 대한 scanf는 문제가 있습니다. 참조 : Reading a string with scanf

#include <stdlib.h> 
... 
printf("Welcome to the Worker Register\n\nWorker Data\n\nName: "); 
fgets(n, 256, stdin); 
... 

fgets()의 크기 매개 변수에 관해서. 남자 페이지 상태 :

는 fgets()는 s가 가리키는 버퍼에 스트림 및 저장 그들로부터 size - 1 개 이하의 문자를 기껏에서 읽습니다. EOF 또는 개행 후에 읽기가 중지됩니다. 개행을 읽으면, 버퍼에 저장됩니다. 버퍼가 인 마지막 문자 뒤에 'null'바이트 ('\ 0')가 저장됩니다.

따라서 버퍼의 크기를 입력하고 null 바이트를 무시하면 fgets가 해당 작업을 수행합니다.

+0

예, 스레드와 그 스레드를 읽었지만 C 코스를 시작할 때입니다. 그래서 포인터가 무엇인지 모릅니다. 나는 그것을 배우려고했지만, 나는 그것을 아주 잘 이해할 수 없었습니다. 그래서 지금은 제쳐두고 제가 공부할 때 돌아올 것입니다. 고맙습니다! @ 편집 : fgets는 어떤 라이브러리에서 왔습니까? – Gibas

+0

'fgets()'는'scanf()'와 같은 라이브러리에 있습니다. – chux

+0

버퍼 오버 플로우에 관해서는, "fgets (n, 255, stdin);" "fgets (n, 256, stdin);"대신 "? – Gibas

1

그냥 getchar(); 솔직히 말해서, 나는 왜 그런지 모르지만 학교에서 나에게 이런 일이 많이 일어났습니다.

코드 :) 수정 듯하십시오 getchar가를() 문제를 해결할 것으로 보인다 추가

#include <stdio.h> 
int main() 
{ 
    // var 
    char n[256], ad[256]; // n - Name, ad - Address 
    int i, ag; // i - Income, ag - Age 
       // code 
    printf("Welcome to the Worker Register\n\nWorker Data\n\nName: "); 
    scanf("%255[^\n]", n); 
    printf("Address: "); 
    getchar(); 
    scanf("%255[^\n]", ad); 
    printf("Age: "); 
    scanf("%d", &ag); 
    printf("Income: R$"); 
    scanf("%d", &i); 
    printf("Worker %s\nAddress: %s\nAge: %d\nIncome: R$%d", n, ad, ag, i); 
    return 0; 
} 
+0

getchar()은 실제로 무엇을합니까? @ 편집 : 사용하려면 어떤 라이브러리가 필요합니까? – Gibas

+1

'ad'를 읽은 후에'getchar()'이 필요하지 않은 이유를 설명하는 것이 친절 할 것입니다. 당신이 맞습니다. 절대적으로 필요하지는 않지만, 왜 그렇지 않은지는 분명하지 않습니다. 그것은 내 코드 였기 때문에 대칭성 때문에 거기에있을 것입니다. 'scanf()'가 단지 그것이 수행된다고 가정하는 것이 아니라 작동하는지 점검해야한다. –

+0

잘 모르겠지만 [link] (http://stackoverflow.com/questions/3676796/what-does-getchar-exactly-do) ** 여기 ** – Nad

0

"%255[^\n]"는 (개행 이외의 입력을 받아들이고) 개행까지 입력을 의미한다. (개행은 포함하지 않는다.)
그래서, 제 (표준 입력의) 입력 버퍼
제 scanf와 개행있다 (scanf("%255[^\n]", ad);)는 개행 이외의 입력도 허용합니다.
그래서 입력되지 않습니다.

따라서 첫 번째 scanf에서 개행을 사용해야합니다.
예 : scanf("%255[^\n]%*c", n);%*c은 한 문자 (즉 개행 문자)를 무시합니다.

세 번째 scanf의 %d은 이전 공백을 건너 뛰므로 두 번째 scanf에는 이 필요하지 않습니다.

관련 문제