2D 배열을 채우기 위해 사용자 입력을 사용하고 있습니다. 사용자가 한 줄에 숫자를 입력 한 다음 중첩 루프를 사용하여 다음과 같이 배열을 채 웁니다.
//User inputs: "1 2 3 4 5"
for(i = 0; i < r; i++){
for(j = 0; j < c; j++){
scanf("%d", &arr[i][j]);
}
}
그러나 문제는 사용자가 6 개의 공간이있을 때 5 개의 int를 입력하면 다른 입력을 기다린다는 것입니다. 숫자가 충분하지 않은지 어떻게 알 수 있습니까?
나는 이것을 사용해 보았지만 작동하지 않았습니다.
for(i = 0; i < r; i++){
for(j = 0; j < c; j++){
if (!feof(stdin)){
scanf("%d", &arr[i][j]);
}
else{
printf("insufficient datapoints\n");
}
}
}
목표를 달성하는 한 가지 방법 은 한 번에 한 줄씩 읽는 대신를 사용하는 fgets()
것입니다 scanf()
. 그런 다음 strtok()
입력 줄을 strtol()
토큰으로 나누고 토큰을 숫자로 구문 분석하는 데 사용할 수 있습니다. 와 비교할 때 구조화되지 않은 사용자 입력을 처리 scanf()
하는 fgets
데 훨씬 사용 하기 쉽습니다 .
아래 코드가이를 수행합니다. 입력 행에 요소가 너무 많거나 요소가 너무 적거나 요소 중 하나가 유효한 숫자가 아닌 경우 메시지가 인쇄되고 행을 다시 입력해야합니다.
사용자가 각 줄을 입력 strtok()
할 때 줄을 토큰으로 나누는 데 사용됩니다. 토큰 구분 기호 목록은에 저장됩니다 delims[]
. 토큰은 공백이나 탭으로 구분할 수 있습니다. 구분 기호 자체는 토큰의 일부가 아니므로 이러한 문자를 포함 \r
하고 \n
줄에있는 최종 토큰의 일부가되지 않도록합니다.
토큰이 발견 strtol()
되면 가능한 경우 정수로 변환하는 데 사용됩니다. 에 대한 호출 후 strtol()
포인터 tail
는 숫자의 일부가 아닌 토큰의 첫 번째 문자를 가리 킵니다. 경우 tail
받는 점 NUL
터미네이터, 다음 전체 문자열, 숫자로 분석했다 그렇지 않으면 입력이 나쁜 것으로 간주되며 행을 다시 입력해야합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1000
int main(void)
{
size_t r = 3;
size_t c = 5;
size_t i, j;
char buffer[BUF_SIZE];
char *token;
char *tail;
const char delims[] = " \t\r\n";
int arr[r][c];
int temp_val;
printf("Enter rows of %zu data elements:\n", c);
for(i = 0; i < r; i++){
j = 0;
if (fgets(buffer, BUF_SIZE, stdin) == NULL) {
perror("Error in fgets()");
exit(EXIT_FAILURE);
}
token = strtok(buffer, delims);
while (token != NULL) {
temp_val = strtol(token, &tail, 10);
if (*tail == '\0') {
arr[i][j] = temp_val;
++j;
} else { // token not a valid number
j = 0;
break;
}
if (j > c) { // too many input values
break;
}
token = strtok(NULL, delims);
}
if (j != c) {
printf("insufficient datapoints\n");
--i; // enter row again
}
}
for (i = 0; i < r; i++) {
for (j = 0; j < c; j++) {
printf("%5d", arr[i][j]);
}
putchar('\n');
}
return 0;
}
샘플 상호 작용 :
Enter rows of 5 data elements:
1 2 3 4
insufficient datapoints
1 2 3 4 5 6
insufficient datapoints
1 x 2 3 4
insufficient datapoints
1 2 3 4 x
insufficient datapoints
1 2 3 4 5 x
insufficient datapoints
1 2x 3 4 5
insufficient datapoints
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다