2017-12-14 13 views
-1

나는 구조체에 넣고 화면에 배열을 인쇄하기 위해 서브 루틴을 사용하기 위해 50 자의 배열을 생성하라는 요청을하고있다.배열의 크기를 C에서 바로 얻을 수 없다

이 내가

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

    int Anzahl (char []); 

    int main() 

    { 
    int x; 
    char kette [50]; 
    printf ("Type down something\n"); 
    fgets (kette,50,stdin); 

    struct hullo { 
     char kette [50]; 
    }; 
    x=Anzahl (&kette[50]); 
    printf ("the number of letters is : %d", x); 
    } 


    int Anzahl (char kette[50]) 
    { 
    int x1; 
    puts (&kette[50]); 
    x1 = sizeof (kette[50]); 
    return x1; 
    } 

`

을했던 것입니다 그것은 (더있다하지만 내가 가지고있는 문제는 여기에) 얼마나 많은 문자라고하지만 때마다 나는, 문자 수를 뭔가를 입력 결국 1입니다. 누군가 내가 잘못한 것을 나에게 설명 할 수 있다면 좋을 것이다.

+2

'Anzahl (& kette [50]);'.. 당신의 컴파일러의 소리는? –

+0

C는 배열 크기를 알지 못합니다. – NoImaginationGuy

답변

2

두 가지면에서 틀렸어. 첫째

,

x=Anzahl (&kette[50]); 

가 (보기의 실제 사용 시점에서, 문법적으로) 잘못 함수 호출은, 당신은 단지 두 번째 x=Anzahl (kette);

처럼 주연 주소를 전달해야, 배열은 함수 인수로 전달 될 때 첫 번째 요소에 대한 포인터로 지연됩니다. 따라서 sizeof을 사용하여 입력 된 argumet을 수신 한 매개 변수에서 크기을 가져올 수 없습니다. 그것은를 sizeof 연산자 _Alignof 운영자 또는 단항 & 연산자의 연산, 또는 어레이를 초기화하는 데 사용되는 문자 스트링 인 경우를 제외

인용 C11 장 §6.3.2.1

유형의 '유형의 배열'이있는 표현식은 배열 객체의 초기 요소에 을 가리키는 유형 '포인터'유형의 표현식으로 변환되며 좌변 값이 아닙니다.

및 장 §6.7.6.3

'형식의 배열' '같은 파라미터의 선언' ' 유형 정규화 포인터''로 조정된다 형식 한정자 (있는 경우)는 배열 형식 유도 의 및 ] 내에 지정된 형식 한정자 (있는 경우)입니다. [...]

보너스 :

puts (&kette[50]); 

도 잘못된 것입니다. C 배열은 0부터 시작하여 색인이 생성되므로 별개의 기능입니다. 이 경우 포인터가 잘못되었습니다 (내용을 읽을 수있는 메모리 위치에 액세스하는 경우) undefined behavior이됩니다.

+1

첫 번째 문제는 유형 오류가 아닙니다. & kette [50]는 char *이고, 일부 컴파일러는 배열 타입을 포인터로 직접 소멸시킵니다. 그런 다음 인덱싱과 배열을 가리키는 포인터가 런타임에 문제가됩니다. – NoImaginationGuy

0

함수 인수에 sizeof array을 호출 할 수 없습니다. C 배열에서 포인터로 감쇠되기 때문입니다. 즉, Anzahl(&kette);으로 전화하는 즉시 "50"은 무시되고 기능은 int Anzahl(char *);처럼 보입니다.그래도 sizeof 번을 kette[50]에 전화하면 문제가 될 수 있습니다. 이것은 char의 크기를 바이트 단위로 반환합니다. 항상 1이어야합니다. 대신 sizeof(kette)을 호출해야하지만 앞에서 설명한 이유로 인해 작동하지 않습니다. 배열을 typedef struct arr { char[50]; } arr;과 같은 구조체로 래핑 한 다음 kette[50] 대신이 구조체를 사용하면이 문제를 해결할 수 있습니다.

&kette[50] 대신 Anzahl(kette)으로 전화해야합니다. puts와 동일합니다.

0

Sourav Ghosh가 맞습니다! 최종 버전은 다음과 같아야합니다 :

#include <stdio.h> 
#include <string.h> 
int Anzahl(char kette[50]); 
int main(){ 
    int x; 
    char kette[50]; 
    printf ("Type down something\n"); 
    fgets (kette,50,stdin); 
    x=Anzahl(kette); 
    printf ("the number of letters is : %d", x); 
} 


int Anzahl (char kette[50]){ 
    int x1; 
    puts(kette); 
    //this will print 8 
    x1 = sizeof(kette); 
    //if you need the string length you should use 
    //but this will include the \n terminator... 
    return strlen(kette); 
}