这个问题在这里已有答案:
我正在做的练习要求创建一个包含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。如果有人可以向我解释我做错了什么会很好。
你错了,在两个方面。
首先是函数调用
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。
你不能在函数参数上调用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相同。
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);
}