stdin
의 사용자 입력은 까다 롭습니다.
OP의 "입력이 10자를 넘으면 프로그램이 할당되지 않은 메모리에 쓸 것입니다"라는 문제가 1 개 있습니다. 입력이 보다 길면 프로그램은 할당되지 않은 메모리에 기록합니다. 이 good answer 의해 제안
getline();
char str[10];
scanf("%s", str);
는 일반적인 해결책이다.
좋은 디자인 목표로 "스캔 중에 동적 할당"이라는 아이디어를 거부합니다. 끝이없는 입력을 허용하는 프로그램은 남용되기 쉽습니다. 사용자가 시스템 자원을 압도 할 수 있습니다. 좋은 코드는 입력을 먼저 확인합니다. 더 이상 Heartbleed.
대신 입력 길이 (10, 1000 또는 1,000,000)와 2x 정도의 버퍼가 제공되도록 stdin
입력을 평가하는 것이 좋습니다.
#define MAX_EXPECTED_SIZE 100
char buf[MAX_EXPECTED_SIZE * 2];
if (fgets(buf, sizeof buf, stdin)) {
size_t len = strlen(buf);
if (len + 1 == sizeof buf && buf[len] != '\n') {
// Assume hostile input and act accordingly. Possibly exiting with message.
// or consume rest of line
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
return ERROR_LONG_LINE
}
// Use buf[]
}
코드는 오른쪽 크기의 메모리가 이후에 유지 될 buf
요구의 복사 할당 할 수 있습니다.
원하는 기능을 정확히 수행하지 못하게하는 요인은 무엇입니까? (또한,'str'에 대한 선언은 10 포인터의 배열을 생성합니다. 이것은 아마도 당신이 원하는 것이 아닙니다.) –
사용자 입력에'scanf '를 사용하지 마십시오. – melpomene
@DavidSchwartz 내 기술이 충분히 높지 않습니다. 나는 도서관을 읽으려고했으나 그것에 대해 쓰여진 내용을 거의 이해하지 못했다. (주석 제외) – nounoursnoir