提问人:Pankit Shah 提问时间:11/2/2022 最后编辑:Vlad from MoscowPankit Shah 更新时间:11/2/2022 访问量:84
尝试使用 strlen() 通过指针输出字符串的长度
Trying to output the length of a string using strlen() through a pointer
问:
我正在尝试使用 strlen() 输出字符串的长度。但我想通过指针来做到这一点。
这是我尝试过的: `
#include <stdio.h>
#include <string.h>
int main()
{
char a[]="wel";
int *p;
p=&a;
printf("%d\n",strlen(*p));
}
然后在代码声明中将 *p 更改为 *p[]:
#include <stdio.h>
#include <string.h>
int main()
{
char a[]="wel";
int *p[];
p=&a;
printf("%d\n",strlen(*p));
}
但随后我收到一个错误“'p'的存储大小未知”。 我还缺少什么?
答:
-2赞
Peter Irich
11/2/2022
#1
p 不是字符串,它是键入 int 的指针。 为什么不使用
printf("%d\n",strlen(a));
然后使用
char a[4]="wel";
评论
0赞
Ted Lyngmo
11/2/2022
OP 说“但我想通过指针来做到这一点”,所以我认为这个答案没有帮助。
1赞
ikegami
11/2/2022
此外,这是错误的格式说明符。因此,它不仅没有回答问题,而且是错误的。
0赞
Vlad from Moscow
11/2/2022
@Peter irich 代替 char a[4]=“wel”;最好写 char a[]=“wel”;
0赞
Peter Irich
11/2/2022
我非常不喜欢这种结构,也从不使用它:char *[];
2赞
ikegami
11/2/2022
#2
除了在少数情况下(值得注意的是),数组在使用时会降级为指向其第一个元素的指针。所以这就是你需要的:sizeof
char *p = a; // Same as `p = &(a[0])`
printf( "%zu\n", strlen( p ) );
请注意,返回 和 是正确的格式说明符。strlen
size_t
%zu
0赞
Vlad from Moscow
11/2/2022
#3
使用字符串文本初始化的数组的声明a
char a[]="wel";
相当于
char a[4]="wel";
因此,表达式具有类型,但指针具有类型&a
char ( * )[4]
p
int *
int *p;
并且指针类型之间没有隐式转换。
同样,该函数需要该类型的指针,但您传递的是该类型的表达式strlen
char *
int
printf("%d\n",strlen(*p));
此外,该函数的返回类型为 。因此,至少您必须使用 conversion 说明符,而不是在 的调用中。strlen
size_t
zu
d
printf
看来你的意思如下
#include <stdio.h>
#include <string.h>
int main( void )
{
char a[] = "wel";
char *p;
p = a;
printf( "%zu\n", strlen( p ) );
}
在此分配语句中
p = a;
右侧表达式中使用的数组隐式转换为指向其类型的第一个元素的指针。a
char *
至于第二个程序,你声明了一个指针数组,但没有指定元素的数量
int *p[];
这种声明是无效的。
此外,数组没有您尝试使用的赋值运算符
p=&a;
所以第二个程序整体上没有意义。
如果要将表达式用作初始值设定项,则必须将指针声明为&a
p
char ( *p )[4];
或
char ( *p )[sizeof( a )];
在这种情况下,程序可以按以下方式查找
#include <stdio.h>
#include <string.h>
int main( void )
{
char a[] = "wel";
char ( *p )[sizeof( a )];
p = &a;
printf( "%zu\n", strlen( *p ) );
}
评论
int*
char*
char *p; p = a; printf("%zu\n", strlen(p));;
p
strlen(a)
int
p = a;
p = &a[0];
&a
arr[4]