2013-10-26 3 views
2

내 코드와 함께 시작됩니다 :C에서 표준 입력의 길이를 얻는 방법은 무엇입니까?

char input[40]; 
fgets(input, 40, stdin); 
if(checkPalin(input) == 0) { 
    printf("%s ist ein Palindrom \n", input); 
} 
else { 
    printf("%s ist kein Palindrom \n", input); 
} 

내가하고 싶은 것은 : 일부 standardinput을 읽고 그것이 회문인지 아닌지 제 기능을 확인하십시오.

내 문제는 다음과 같습니다. 표준 입력의 길이를 어떻게 얻을 수 있습니까? 왜냐하면 그것이 40 문자보다 크다면 나는 errormessage를 넣고 싶습니다. 게다가 char 배열이 실제 입력의 정확한 길이가되기를 바랍니다.

아무도 도와 줄 수 있습니까?

fgets(input, 40, stdin);

input

답변

1

fgets(input, 40, stdin);

길이를 사용하여 바이트 fgets()가에서 쓴 수있는 방법을 얻고 싶은 경우에 == 39characters + NUL 문자

당신은 문자열 길이를 줄 경우 39자를 초과하면 fgets()은 처음 39자를 읽고 nul character('\0')을 40 자로 입력하고 나머지 문자는 무시합니다.

당신이 문자열을 예를 들어 5 미만 39 개 문자를 줄 경우는 장소는 뉴 라인도 길이가

가 개행 문자를 제거하는 것을 잊었다하지 마십시오 (NUL 문자 제외) 6이된다 읽습니다.

char input[60]; 
fgets(input,sizeof input,stdin); 

예를 들어 입력 버퍼 크기를 약 60으로 선언 한 다음 40자를 초과하는 오류 검사를 수행하려는 경우

당신은 단순히 strlen() 확인 및 길이를 확인할 수 있습니다 오류 메시지가 너무

당신은 그냥 밝혀졌다 NULL

1

40와 같은보다 문자 수 (널 종료 포함) 당신은 검사를 수행 할 필요가 없습니다

이 보장됩니다.

그리고 input 당신은 항상 fgets에서 생산 된 문자열로, inputstrlen() 기능을 사용할 수 있습니다 항상 종료 null의 크기를 가져 오는

.

+0

그러나 예를 들어 표준 입력란이 45 문자 인 경우. 이 경우에는 40 문자를 얻고 자르기보다는 오류 메시지를 넣고 싶습니다. 내가 어떻게 그럴 수 있니? –

+0

@JakobAbfalter 아마도 당신은'fgets'의 버전을 쓰고, 입력을 문자로 받아 들여서 C 문자열을 만들 필요가 있습니다. char의 수가 최대 크기보다 커지면 메시지를 출력 할 것입니다. 또한 안전하지 않고 버퍼 오버플로에 취약하기 때문에'gets '를 제안하지 않을 것입니다. – P0W

1

아무 기능도 없으므로 직접 작성해야합니다. 즉, 바이트 단위로 읽음으로써 EOF 문자를 찾습니다. 하지만 오버플로를 피하기 위해 네가하고 있다고 알지? 입력이 40 자보다 큰 경우 추가 값이 fgets() 함수에 의해 버퍼에 저장되지 않으므로 보장 할 필요가 없습니다. 은 요청한 크기보다 큰입니다. 값은 40보다 작을 수 있습니다 -보다 크거나 같지만 결코 크지 않습니다.

편집 : "어떻게 C에서 standardinput의 아이폰에 활용하는"으로

stdin에 얼마나 많은 바이트가 있는지 얘기하고 있다고 생각했습니다. 나는 그 일에 대해 유감이다. 당신은 40 자 이상으로 가지 말았어야 입력 strlen()

+0

getline() 함수는 OP가 필요로하는 것과 정확히 일치하며 2008 년부터 POSIX 표준의 일부입니다. "잠재적 중복 "위의 설명. –

+0

하지만 OP가 플랫폼을 언급하지 않았습니다 ... –

1

에 대해 fgets() 검사와 오류를 확인하려면 아니라고 이상 40.then 쇼 malloc() 문자열을 반환하기 위해 반복적으로 fgets()을 사용하는 함수를 작성하기 쉽습니다.

이 함수는 적절한 오류보고를 수행하지 않습니다. realloc() 또는 fgets()을 사용하여 오류가 발생하면 지금까지 검색된 데이터가 반환됩니다.

외에도이 기능은 꽤 유용합니다.

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

char * read_one_line(FILE * in) 
{ 
    size_t alloc_length = 64; 
    size_t cumulength = 0; 
    char * data = malloc(alloc_length); 
    while (1) { 
     char * cursor = data + cumulength; // here we continue. 
     char * ret = fgets(cursor, alloc_length - cumulength, in); 
     printf("r %p %p %zd %zd %zd\n", data, cursor, cumulength, alloc_length, alloc_length - cumulength); 
     if (!ret) { 
      // Suppose we had EOF, no error. 
      // we just return what we read till now... 
      // there is still a \0 at cursor, so we are fine. 
      break; 
     } 
     size_t newlength = strlen(cursor); // how much is new? 
     cumulength += newlength; // add it to what we have. 
     if (cumulength < alloc_length - 1 || data[cumulength-1] == '\n') { 
      // not used the whole buffer... so we are probably done. 
      break; 
     } 
     // we need more! 
     // At least, probably. 
     size_t newlen = alloc_length * 2; 
     char * r = realloc(data, newlen); 
     printf("%zd\n", newlen); 
     if (r) { 
      data = r; 
      alloc_length = newlen; 
     } else { 
      // realloc error. Return at least what we have... 
      // TODO: or better free and return NULL? 
      return data; 
     } 
    } 
    char * r = realloc(data, cumulength + 1); 
    printf("%zd\n", cumulength + 1); 
    return r ? r : data; // shrinking should always have succeeded, but who knows? 
} 

int main() 
{ 
    char * p = read_one_line(stdin); 
    printf("%p\t%zd\t%zd\n", p, malloc_usable_size(p), strlen(p)); 
    printf("%s\n", p); 
    free(p); 
} 
관련 문제