尝试使用 strlen() 通过指针输出字符串的长度

Trying to output the length of a string using strlen() through a pointer

提问人:Pankit Shah 提问时间:11/2/2022 最后编辑:Vlad from MoscowPankit Shah 更新时间:11/2/2022 访问量:84

问:

我正在尝试使用 strlen() 输出字符串的长度。但我想通过指针来做到这一点。

这是我尝试过的: `

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

int main()
{
    char a[]="wel";
    int *p;
    p=&a;
    printf("%d\n",strlen(*p));
}

该图显示了我在编译时遇到的错误:enter image description here

然后在代码声明中将 *p 更改为 *p[]:

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

int main()
{
    char a[]="wel";
    int *p[];
    p=&a;
    printf("%d\n",strlen(*p));
}

但随后我收到一个错误“'p'的存储大小未知”。 我还缺少什么?

指针 C-strings 赋值运算符 strlen

评论

0赞 Ted Lyngmo 11/2/2022
是什么让你用 an 而不是 ?它应该是int*char*char *p; p = a; printf("%zu\n", strlen(p));;
0赞 jvx8ss 11/2/2022
你不需要变量,它只是pstrlen(a)
1赞 Ted Lyngmo 11/2/2022
@jvx8ss“但我想通过指针来做到这一点”
0赞 Pankit Shah 11/2/2022
@TedLyngmo 您建议的更改奏效了!谢谢。对不起,指针不是用来存储整数地址的吗?而且 p 存储 a 的地址,所以不应该是 p=&a?
1赞 ShadowRanger 11/2/2022
@PankitShah:指针将地址存储为指针。您可以使用它们执行一些类似 int 的操作,但大小不可靠匹配(通常为 4 个字节,指针在 64 位系统上更大),并且它指向的类型与其指针无关。 (或等效的 ) 是正确的,因为数组降级为指向其第一个元素的指针;从技术上讲,是获取指向的指针(因此递增它会使指针移动四个字节,而不是一个字节),但在实践中,大多数编译器都允许这种轻微的偏心率。intp = a;p = &a[0];&aarr[4]

答:

-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 ) );

请注意,返回 和 是正确的格式说明符。strlensize_t%zu

0赞 Vlad from Moscow 11/2/2022 #3

使用字符串文本初始化的数组的声明a

char a[]="wel";

相当于

char a[4]="wel";

因此,表达式具有类型,但指针具有类型&achar ( * )[4]pint *

int *p;

并且指针类型之间没有隐式转换。

同样,该函数需要该类型的指针,但您传递的是该类型的表达式strlenchar *int

printf("%d\n",strlen(*p));

此外,该函数的返回类型为 。因此,至少您必须使用 conversion 说明符,而不是在 的调用中。strlensize_tzudprintf

看来你的意思如下

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

int main( void )
{
    char a[] = "wel";
    char *p;

    p = a;

    printf( "%zu\n", strlen( p ) );
}

在此分配语句中

p = a;

右侧表达式中使用的数组隐式转换为指向其类型的第一个元素的指针。achar *

至于第二个程序,你声明了一个指针数组,但没有指定元素的数量

int *p[];

这种声明是无效的。

此外,数组没有您尝试使用的赋值运算符

p=&a;

所以第二个程序整体上没有意义。

如果要将表达式用作初始值设定项,则必须将指针声明为&ap

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 ) );
}