我有点困惑为什么我的代码在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.我将如何在内存中遍历指向字符串的指针呢?
干杯
3条答案
按热度按时间bmp9r5qi1#
对于初学者,您不应该使用与标准C函数相同的方式命名您的用户定义函数。
标头
<stdlib.h>
中已声明了名称为atoi
的标准C函数。使用相同的名称可能导致编译器或链接器错误。您的函数
atoi
声明为这和
由于编译器将数组类型的参数调整为指向数组元素类型的指针,因此接受“双精度”指针。因此使用具有双精度指针的函数
strlen
调用未定义的行为函数
strlen
需要类型为char *
或const char *
的参数,但不需要类型为const char **
的参数。此外,函数
strlen
的返回值的类型为size_t
,并且在调用printf
时使用转换说明符%d
,而相应的参数表达式的类型为size_t
,则会再次调用未定义的行为,必须使用转换说明符%zu
而不是%d
。这个for循环
没有意义,因为变量
length
实际上不包含传递的数组中的元素数。您需要显式地传递数组中的元素数,或者数组应该有一个标记值。
函数
int
的返回类型也没有意义,因为返回值0
对函数的调用者没有报告任何有用的信息。如果函数设计为只遍历for循环中的字符串,那么它应该声明为
如果你想给函数传递一个字符串数组,那么函数可以通过下面的演示程序来实现,只要数组包含一个标记值
程序输出为
7qhs6swi2#
1.不要使用标准函数名
strlen
接受指向char
的指针,并返回**size_t
**(非int)1.您的打印格式错误。
1.您的函数接受指针数组,而不是指向
char
的指针4urapxun3#
当做strlen(s)时,为什么它工作,但当做strlen(* s)时,它不工作?
strlen()
需要类型为const char *
的参数,而不是const char **
。您将指向char
的指针数组传递给函数,该数组已衰减为char **
。从手册页中可以看到:strlen()函数的作用是:计算s所指向的字符串的长度,不包括终止的空字节('\0')。
我将如何在内存中遍历指向字符串的指针呢?
假设你想传递一个字符串(以空值结尾的字节数组)添加到函数中,并将其打印为
char
(按char
),将函数声明更改为接受const char *
,并在对printf()
的调用中使用正确的格式说明符(%s
说明符需要指向char
的指针,而不是char
本身)。将调用更改为:注意,
*(s + i)
等价于s[i]
,s[i]
的可读性更强,因此上面对printf()
的调用可以重写为:另外:
strlen()
返回size_t
,而不是int
。不要使数值类型不匹配。