2017-10-25 1 views
1

.txt 파일을 인수로받는 C 프로그램을 작성 중입니다. .txt 인 내부 정수 번호 행은 다음과 같이, 그들 사이에 공간이있다 : I는 정수가 아닌 문자가 .txt 파일 내부에 표시하는 경우처럼, 알아 하죠C : 배열에서 숫자가 아닌 문자 검색

1 2 3 4 
5 6 7 8 
... 

이 :

C에는 instanceof 연산자가 없기 때문에, I는 0-9 번호를 포함하고 공간 또는 정수 중 하나 인 경우,이 .txt 파일의 각 문자를 확인 배열을 사용
1 2 a 4 
... 

. 둘 다 같지 않으면 프로그램을 종료해야합니다. 파일에 문제가 없으면 프로그램은 중간 값을 계산하고 stdout에 줄을 인쇄합니다. 이 내 코드입니다 :

#include <stdio.h> 
#include <ctype.h> 

int arrayContains(char value); 

int main(int argc, char **argv) { 
    const int LINESIZE = 255; 
    if (argc != 2) { 
     printf("wrong args!"); 
     return -1; 
    } 
    char *command1 = argv[1]; 
    FILE *handle = fopen(command1, "r"); 
    if (!handle) { 
     printf("file not found!"); 
     return -1; 
    } 
    int count = 0; 
    int sum = 0; 
    int median; 
    char string[LINESIZE]; 
    while (fgets(string, LINESIZE, handle) != NULL) { 
     for (int i = 0; i <= sizeof(string)/sizeof(string[0]) - 1; i++) { 
      printf("%c", string[i]); 
      if (string[i] == ' ') { 
       i++; 
      } 
      else if (arrayContains(string[i]) == 0) { 
       count++; 
       sum += (int)string[i]; 
      } 
      else { 
       printf("non-integer-character found!\n"); 
       return -1; 
      } 
     } 
     median = sum/count; 
     printf("%s\n", string); 
     printf("%d\n", median); 
    } 
} 

int arrayContains(char value) { 
    const char numbers[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
    for (int i = 0; i <= 9; i++) { 
     if (numbers[i] == value) { 
      return 0; 
     } 
    } 
    return -1; 
} 

이제 프로그램의 출력은 TXT 파일의 첫 번째 숫자는 항상 즉시 그 이후 : "정수가 아닌 문자가 발견". ArrayContains() 함수 내의 gets()에서 문자열의 요소와 상수 "numbers"배열의 요소를 비교하면 arrayContains() 함수에서 항상 -1이 반환됨을 알 수 있습니다. 내가 뭘 잘못하고 있니?

+3

['남자 isdigit'] (https://linux.die.net/man/3/isdigit) –

+2

'내가 <= sizeof 연산자 (문자열)/ – BLUEPIXY

+3

관련이 없지만 "정수가 아닌 문자"와 같은 것은 없지만 "자릿수가 아닌 문자"가 있습니다. –

답변

1

코드에 몇 가지 문제가 있습니다.

이 비트는 공백과 일치하지만 루프도 i++을 수행하므로 다음 문자를 건너 뜁니다.

if (string[i] == ' ') { 
    i++; 
} 

숫자를 숫자로 변환하는 올바른 방법은 아닙니다. 당신이 여기서 얻고있는 것은 숫자 값보다는 문자의 ASCII 값입니다.당신이 '1'이있는 경우 예를 들어, 그래서 당신은 오히려 1보다

sum += (int)string[i]; 

다른 곳에서 설명하고있는 바와 같이, 당신은 당신이 숫자 문자를 가지고있는 경우에 식별 할 수 isdigit()를 사용하는 것이 더 낫다 합계 49을 추가하고 있습니다. isspace()을 사용하여 공백 또는 '\ n'문자가 있는지 (모든 공백을 포함하는지) 테스트 할 수 있습니다. 당신이 전체 문자열을 처리 할 수 ​​있고 버퍼의 크기보다 긴 라인을 쉽게 처리 할 수 ​​있다면 루프 문을 훨씬 덜 복잡하게 만들 수 있습니다.

이 코드는 당신이 가지고있는 문제를 해결

while (fgets(string, LINESIZE, handle) != NULL) { 
    for (char *pos=string; *pos!='\0'; pos++) { 
     printf("%c", *pos); 
     if (isdigit(*pos)) { 
      count++; 
      sum += *pos-'0'; 
     } elseif(!isspace(*pos)) { 
      printf("non-integer-character found!\n"); 
      return -1; 
     } 
    } 
    median = sum/count; 
    printf("%s\n", string); 
    printf("%d\n", median); 
} 
2

당신은 실제로 isdigit C 기능을 확인해야합니다!

#include <ctype.h> 

int hasDigit(const char *s) 
{ 
    while (*s) { 
     if (isdigit(*s++) == 0) return 0; 
    } 

    return 1; 
} 

위의 코드는 빈 문자열에 1을 반환합니다. 조심해! arrayContains 대신 내 기능을 사용할 수 있습니다. (당신은 사용 size_t로를 문자열의 길이하지만 포인터의 메모리 크기를 반환하지 않습니다 운영자를 sizeof()를

int arrayContains(char value) { 
    return isdigit(value)?0:-1; 
} 
+0

젠장, 더 짧아! Op 솔루션은 실제로 비효율적이며 전체적으로 나쁘지 않습니다! –

+0

'arrayContains'와 OP의 중요한 차이점을 보지 못했습니다. –

+0

for 루프의 두 번째 부분 –

-1

: 당신이 당신의 루틴을 사용하려면, 내 "버전"을 확인하시기 바랍니다 그래서 8 바이트). , C에서

for (int i = 0; string[i] != '\0' && string[i] != '\n'; i++) { 
    ... 
} 

문자열 메모리의 단지 일부분 그냥 좋아하는 것 및 배열과 길이를 얻을 수있는 유일한 방법은 끝을 찾을 수 있습니다 :

나는 당신이 당신의 for 루프 이것을 사용하는 것이 좋습니다 ('\ 0')

또한 ASCII 테이블을 직접 검색하는 것이 좋습니다. 문자는 0에서 127 사이의 숫자입니다. 숫자는 48에서 57 사이이며, 간단한 조건으로 처리됩니다! 내가 보인다

if (string[i] <= 48 && string[i] >= 57) { 
    ... 
} 
+0

arrayConsains 반환 값 문제를 해결하지 못함 –

+0

Krzysztof Szewczyk이 말한대로 arrayContains가 필요하지 않습니다. isDigit을 사용하거나 Ascii 테이블을 사용할 수 있습니다. – Soocks

+0

'121'과'112 '라는 마법 번호는 무엇입니까? –

0

그것을 해결 것으로 예상대로

#include <stdio.h> 
#include <ctype.h> 

int arrayContains(char value); 

int main(int argc, char **argv) { 
    const int LINESIZE = 255; 
    if (argc != 2) { 
     printf("wrong args!"); 
     return -1; 
    } 
    char *command1 = argv[1]; 
    FILE *handle = fopen(command1, "r"); 
    if (!handle) { 
     printf("file not found!"); 
     return -1; 
    } 
    int count = 0; 
    int sum = 0; 
    int median; 
    char string[LINESIZE]; 
    while (fgets(string, LINESIZE, handle) != NULL) { 
     for (int i = 0; i <= sizeof(string)/sizeof(string[0]) - 1; i++) { 
      printf("%c\n", string[i]); 
      if (isspace(string[i]) == 0) { 
       i++; 
      } 
      else if (isdigit(string[i]) == 0) { 
       count++; 
       sum += (int)string[i]; 
      } 
      else { 
       printf("non-integer-character found!\n"); 
       return -1; 
      } 
     } 
     fgets(string, LINESIZE, handle); 
    } 
    median = sum/count; 
    printf("%s\n", string); 
    printf("%d\n", median); 
} 

지금 좀 작업을 수행합니다.

+0

하지만 여전히 공백 문자를 건너 뛰는 중입니다. –

+0

예 공백 문자를 사용하지 않으므로 공백 문자를 건너 뛰고 있습니다. 정수로 작업하고 싶습니다. –

+1

아니요. 공간을 건너 뛰고 있습니다. 그 다음에는 캐릭터가 나중에 'i ++' –

관련 문제