C语言中strlen参数的理解

js5cn81o  于 2023-02-03  发布在  其他
关注(0)|答案(3)|浏览(154)

我有点困惑为什么我的代码在C编程中不迭代字符串。
基本上。
我有这个函数

int atoi(const char *s[]){
    printf(" The length is  %d",strlen(s));

    int length = strlen(s);

    for(int i = 0; i< length; ++i){
        printf("This is %s",*(s+i));
    }
    return 0;
}

第一个问题
1.当执行strlen(s)时,为什么它工作,但当执行strlen(*s)时,它不工作,strlen不应该接受值而不是指针,所以后者应该工作吗?
1.我将如何在内存中遍历指向字符串的指针呢?
干杯

bmp9r5qi

bmp9r5qi1#

对于初学者,您不应该使用与标准C函数相同的方式命名您的用户定义函数。
标头<stdlib.h>中已声明了名称为atoi的标准C函数。使用相同的名称可能导致编译器或链接器错误。
您的函数atoi声明为

int atoi(const char *s[]){

这和

int atoi(const char **s){

由于编译器将数组类型的参数调整为指向数组元素类型的指针,因此接受“双精度”指针。因此使用具有双精度指针的函数strlen调用未定义的行为

printf(" The length is  %d",strlen(s));

函数strlen需要类型为char *const char *的参数,但不需要类型为const char **的参数。
此外,函数strlen的返回值的类型为size_t,并且在调用printf时使用转换说明符%d,而相应的参数表达式的类型为size_t,则会再次调用未定义的行为,必须使用转换说明符%zu而不是%d
这个for循环

for(int i = 0; i< length; ++i){
    printf("This is %s",*(s+i));
}

没有意义,因为变量length实际上不包含传递的数组中的元素数。
您需要显式地传递数组中的元素数,或者数组应该有一个标记值。
函数int的返回类型也没有意义,因为返回值0对函数的调用者没有报告任何有用的信息。
如果函数设计为只遍历for循环中的字符串,那么它应该声明为

char * func( const char *s )
{
    for ( const char *p = s; *p != '\0'; ++p )
    {
        putchar( *p );
    }

    return ( char * )s;
}

如果你想给函数传递一个字符串数组,那么函数可以通过下面的演示程序来实现,只要数组包含一个标记值

#include <stdio.h>

void func( const char **s )
{
    for ( ; *s != NULL; ++s )
    {
        printf( "%s ", *s );
    }
}

int main( void )
{
    const char * s[] = { "Hello", "World!", NULL );        

    func( s );
    putchar( '\n' );
}

程序输出为

Hello World!
7qhs6swi

7qhs6swi2#

1.不要使用标准函数名

  1. strlen接受指向char的指针,并返回**size_t**(非int)
    1.您的打印格式错误。
    1.您的函数接受指针数组,而不是指向char的指针
int myfunc(const char *s)
{
    size_t length = strlen(s);

    printf(" The length is  %zu", length);
    for(size_t i = 0; i< length; ++i){
        printf("This is '%c'\n",*(s+i));
    }
    return 0;
}
4urapxun

4urapxun3#

    • 问题:**

当做strlen(s)时,为什么它工作,但当做strlen(* s)时,它不工作?

    • 答案:**

strlen()需要类型为const char *的参数,而不是const char **。您将指向char的指针数组传递给函数,该数组已衰减为char **。从手册页中可以看到:
strlen()函数的作用是:计算s所指向的字符串的长度,不包括终止的空字节('\0')。

    • 问题:**

我将如何在内存中遍历指向字符串的指针呢?

printf("This is %s",*(s+i));
    • 答案:**

假设你想传递一个字符串(以空值结尾的字节数组)添加到函数中,并将其打印为char(按char),将函数声明更改为接受const char *,并在对printf()的调用中使用正确的格式说明符(%s说明符需要指向char的指针,而不是char本身)。将调用更改为:

printf ("%c", *(s + i));

注意,*(s + i)等价于s[i]s[i]的可读性更强,因此上面对printf()的调用可以重写为:

printf ("%c", s[i]);

另外:strlen()返回size_t,而不是int。不要使数值类型不匹配。

相关问题