关于C语言中strlen参数及字符串遍历的技术疑问
C字符串迭代与strlen使用问题解答
首先贴出你提供的函数代码:
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不是接收值而非指针吗?
- 先纠正核心误解:
strlen的参数是**const char*类型的指针**,它靠指针遍历内存直到遇到'\0'终止符来计算长度,根本不接收所谓的“值”。 - 你的函数参数
const char *s[]本质等价于const char **s,是指向指针的指针(可理解为字符串数组的首地址):- 调用
strlen(s)时,你把char**类型的指针强转成了char*传给strlen,这是类型不匹配的错误。编译器可能只给警告,但此时strlen会把s指向的内存当成普通字符串遍历,直到碰到位'\0',这属于未定义行为,能运行只是巧合,结果完全不可信。 strlen(*s)才是符合参数要求的调用(*s是const char*类型)。如果运行报错,大概率是你调用这个函数时,传入的*s是空指针(NULL),或者指向的内存没有以'\0'结尾,导致strlen越界访问内存触发错误。
- 调用
问题2:如何通过指针循环遍历内存中的字符串?
分两种场景处理:
场景1:遍历单个字符串(参数为const char* s)
- 下标遍历方式:
const char* s = "hello"; for (int i = 0; s[i] != '\0'; ++i) { printf("当前字符:%c\n", s[i]); }
- 指针自增遍历方式:
const char* s = "hello"; const char* ptr = s; while (*ptr != '\0') { printf("当前字符:%c\n", *ptr); ptr++; }
场景2:遍历字符串数组(参数为const char** s,即你的函数参数类型)
注意字符串数组需要有明确的终止标记(通常用NULL结尾),比如传入的数组是const char* arr[] = {"apple", "banana", NULL};:
int process_strings(const char *s[]){ const char** arr_ptr = s; // 遍历字符串数组中的每个字符串 while (*arr_ptr != NULL) { printf("当前字符串:%s\n", *arr_ptr); // 遍历当前字符串的每个字符 const char* str_ptr = *arr_ptr; while (*str_ptr != '\0') { printf(" 字符:%c\n", *str_ptr); str_ptr++; } arr_ptr++; } return 0; }
内容的提问来源于stack exchange,提问作者Khandkar Islam
相关产品推荐
相关产品推荐

