int my_strlen(char* ch) { if (*ch != '\0') { return 1 + my_strlen(ch + 1); } return 0; } int main() { char ch[20] = { 0 }; scanf("%s", &ch); printf("%d", my_strlen(ch)); return 0; }分析这段代码
时间: 2024-04-18 18:27:04 浏览: 82
这段代码是一个使用递归函数来计算字符串长度的示例。首先,定义了一个名为 `my_strlen` 的函数,该函数接受一个字符指针 `ch` 作为参数。在函数内部,它首先检查当前指针所指向的字符是否为字符串的结束符 `\0`,如果不是,则递归调用自身并将指针向后移动一位,然后返回 1 加上递归调用的结果。这样,递归函数会不断地将问题分解为更小的子问题,直到达到字符串结束符的位置,然后返回最终的结果。
在 `main` 函数中,首先定义了一个大小为 20 的字符数组 `ch`,并使用 `scanf` 函数从标准输入中读取字符串并存储在数组中。之后,调用 `my_strlen` 函数并传入 `ch` 作为参数,计算并返回字符串的长度。最后,使用 `printf` 函数将计算得到的长度打印出来。
需要注意的是,在使用 `scanf` 函数读取字符串时,应该使用 `&ch[0]` 或者简写为 `ch`,而不是 `&ch`。因为数组名 `ch` 本身就是指向数组首元素的指针,所以不需要再取地址。
总之,这段代码的功能是计算输入的字符串的长度,并将结果打印出来。
相关问题
#include<stdio.h> #include<string.h> int fun(char *s) { char *s1=s; for(;s1<s+strlen(s);s1++) if(*s>='0'&&*s<='9') strcpy(str,str+1); } int main() { char ch[100]; int i; gets(ch); puts(ch); return 0; }
这段代码存在一些问题:
1. 函数 `fun` 中定义了一个指针 `s1` 并赋值为 `s`,但在循环内并没有使用该指针进行操作,应该改为 `if (*s1 >= '0' && *s1 <= '9') strcpy(s1, s1+1);`
2. 函数 `fun` 中使用了一个未定义的变量 `str`,应该先定义再使用。
3. 函数 `fun` 没有返回值,应该改为 `void fun(char *s)`。
4. 函数 `main` 中使用了一个未定义的变量 `i`,应该先定义再使用。
5. 函数 `gets` 不安全,容易导致缓冲区溢出,建议使用更安全的函数 `fgets`。
6. 函数 `puts` 输出的是字符串,应该加上双引号。
修改后的代码如下:
```c
#include <stdio.h>
#include <string.h>
void fun(char *s) {
char *s1 = s;
for (; s1 < s + strlen(s); s1++) {
if (*s1 >= '0' && *s1 <= '9') {
strcpy(s1, s1+1);
s1--; // 因为删除了一个字符,指针需要回退一位
}
}
}
int main() {
char ch[100];
fgets(ch, 100, stdin);
puts(ch);
fun(ch);
printf("%s\n", ch);
return 0;
}
```
帮我debug:#include<stdio.h> #include<string.h> int fun(char *s) { char *s1; for(s1=s;s1<s+strlen(s);s1++) if(*s1>='0'&&*s1<='9') strcpy(s1,s1+1); } int main() { char ch[100]; gets(ch); fun(ch); puts(ch); return 0; }
这段代码有两个明显的问题,一个是在 `fun` 函数中,没有返回值;另一个问题是在删除字符串中的数字时,使用了 `strcpy` 函数,这会破坏原有字符串的内存结构,导致程序崩溃。下面是修改后的代码:
```c
#include <stdio.h>
#include <string.h>
void fun(char *s) {
char *s1;
for (s1 = s; s1 < s + strlen(s); s1++) {
if (*s1 >= '0' && *s1 <= '9') {
// 使用指针操作直接删除数字
memmove(s1, s1 + 1, strlen(s1 + 1) + 1);
s1--; // 需要将指针回退一步,以便继续检查当前位置
}
}
}
int main() {
char ch[100];
gets(ch);
fun(ch);
puts(ch);
return 0;
}
```
这里将 `fun` 函数的返回值类型改为 `void`,即不返回任何值。同时,使用了 `memmove` 函数来替代 `strcpy` 函数,实现了直接删除字符串中的数字。在删除数字后,需要将指针回退一步,以便继续检查当前位置。
阅读全文