이것은 주어진 숙제를 숙제하기위한 것입니다. 사용자가 scanf
으로 정렬하려는 문자열의 수를 묻는 메시지를 표시하고 해당 숫자를 기반으로 배열을 할당 한 다음 fgets
으로 문자열 자체를 가져옵니다.scanf와 fgets에 관한 문제
문자열 수가 하드 코드 된 경우 모두 작동하지만 사용자가 나사를 결정할 수 있도록 scanf
이 추가됩니다.
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 20 // Maximum string length.
int main(void)
{
int index, numStrings = 0;
char **stringArray;
printf("Input the number of strings that you'd like to sort: ");
assert(scanf("%d", &numStrings) == 1);
stringArray = (char **)malloc(numStrings * sizeof(char *));
for (index = 0; index < numStrings; index++)
{
stringArray[index] = (char *)malloc(LENGTH * sizeof(char));
assert(stringArray[index] != NULL);
printf("Input string: ");
assert(fgets(stringArray[index], LENGTH, stdin) != NULL);
}
// Sort strings, free allocated memory.
return 0;
}
을 그리고 여기처럼 콘솔 보이는 내용은 다음과 같습니다 : 여기에 코드는이 배열의 시작 부분에 빈 문자열의 결과로, 루프의 첫 번째 반복 건너 뜁니다
Input the number of strings that you'd like to sort: 3 Input string: Input string: foo Input string: bar
. 제 질문은, 왜 그렇게하는지, 어떻게 해결할 수 있습니까? 그래서
Input the number of strings that you'd like to sort: 3 foo Input string: Input string: bar Input string: baz
, 내가 입력, 문자열을 모두 할 수 있지만 문자열에 대한 첫 번째 메시지가 잘못된 위치에 있습니다 : 여기
콘솔이
scanf
에 전달 된 형식 문자열
"%d\n"
으로 보이는거야 . 는 AS [맞은 버튼을 입력 할 때에서]
scanf("%d\n", &numStrings)
없이, scanf와는 잔류 개행 문자를 읽습니다 :
사용자 입력을 읽는 입력 기능과 같이 실패 할 것으로 예상되는 기능에 대해 'assert()'를 수행하지 마십시오. 오류를 무시하는 것보다 낫습니다. 오류를 온전하게 처리하는 것만 큼 좋지 않습니다. –
@Jonathan 조언을 주셔서 감사합니다. – gdejohn