无法在C中获取数组的大小[重复]

问题描述 投票:-1回答:3

我正在做的练习要求创建一个包含50个字符的数组,将它放在一个结构中,然后使用子程序在屏幕上打印数组,并说出它有多少个字符(还有更多,但我有问题)在这儿 )

这就是我做的

    #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。如果有人可以向我解释我做错了什么会很好。

c arrays sizeof
3个回答
2
投票

你错了,在两个方面。

首先是函数调用

 x=Anzahl (&kette[50]);

是错误的(从语法上讲,从实际使用的角度来看),你需要传递主演地址,就像x=Anzahl (kette);

其次,当作为函数参数传递时,数组会延迟指向第一个元素的指针。因此,您不能使用sizeof从接收输入参数的参数中获取预期大小。

引用C11,章节§6.3.2.1

除非它是sizeof运算符,_Alignof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则将具有类型''数组类型''的表达式转换为表达式输入''指向类型'的指针,指向数组对象的初始元素,而不是左值。

并且,章节§6.7.6.3

参数声明为''数组类型''应调整为''限定指向类型'',其中类型限定符(如果有)是在数组类型派生的[]中指定的那些。 [...]

奖金:

  puts (&kette[50]);

也是错的。它是一个接一个,因为C数组是基于0的索引。在这种情况下,你传递一个无效的指针(并访问其内存位置来读取内容),你有undefined behavior


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]来解决。

你也应该调用Anzahl(kette)而不是&kette[50],与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);
}
© www.soinside.com 2019 - 2024. All rights reserved.