计算字符串的长度

这里简单介绍以下求字符串的三种方法

1、计数器

2、递归

3、指针减指针

第一种:计数器

使用my_strlen函数并创建临时变量,具体代码如下

#include<stdio.h>
#include<assert.h>
int my_strlen(char* str)
{
	int count = 0;
	assert(str);
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcfvdg";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

执行结果

 第二种方式:当题目要求不创建临时变量时,可采用递归的方式,具体看下面的代码

int my_strlen(char* str)
{
	assert(str);
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}

这时候只是函数内部的内容变动,主函数不变

运行结果还是依旧是7

第三种方式:指针-指针

#include<stdio.h>
#include<assert.h>
int my_strlen(char* str)
{
	assert(str);//防止指针为空指针
	char* p =  str;
	while (*p != '\0')
	{
		p++;
	}
	return p - str;

}
int main()
{
	char arr[] = "abcfvdg";
	int len = my_strlen(arr);
	printf("%d", len);
	return 0;
}

结果还是7

以上就是计算一个字符串长度的三种方法了

<think>嗯,用户想知道如何用BAT脚本计算字符串长度。我之前学过批处理脚本的一些基本操作,但字符串处理确实有点挑战,因为批处理没有内置的字符串函数。首先,我记得引用里的资料提到过需要自己实现这样的功能,可能需要用到变量截取、循环和延迟扩展这些知识点。 用户的问题是关于计算字符串长度,所以需要找一个方法遍历字符串的每个字符,直到结束,然后统计字符的数量。根据引用[1],其中提到使用call调用、字符串截取、goto和延迟读取变量。可能的方法是逐个截取字符,然后递增计数器,直到截取不到字符为止。 比如,用户提供的示例中可能有这样的思路:初始化一个长度为0的变量,然后循环截取字符串的第n个字符,如果存在,长度加一,直到截取不到为止。这时候需要使用延迟扩展,否则在循环中变量无法实时更新。同时,可能需要用到goto来跳出循环。 另外,引用[5]中提到了字符串截取的例子,用%var:~n,1%这样的方式来截取第n个字符。这可以用来检查每个位置是否有字符存在。当截取到空的时候,说明已经超过了字符串长度,循环结束。 需要注意的是,批处理中的字符串索引是从0开始的吗?比如,%var:~0,1%是第一个字符,%var:~1,1%是第二个,依此类推。所以循环中应该从0开始,每次递增,直到截取不到字符为止,这时候循环的次数就是字符串长度。 可能还需要处理特殊字符的情况,比如空格或特殊符号,这时候可能需要启用延迟变量扩展,使用!var!而不是%var%来避免解析错误。同时,在循环中使用goto和标签来跳转,实现循环结构。 总结一下步骤:初始化长度变量为0,循环中尝试截取第n个字符,存在则长度加一,不存在则退出循环,最后输出长度。这应该就是实现的方法了。现在需要将这些步骤转化为具体的代码,并验证是否正确。</think>在BAT批处理脚本中实现字符串长度计算,可以通过循环截取字符并计数的方式完成。具体实现步骤如下: ### 实现方法 1. **初始化变量**:设置目标字符串和计数器 2. **循环截取字符**:使用`%变量:~起始位置,截取长度%`语法逐字符检测 3. **条件判断**:通过`if defined`判断截取结果是否存在 4. **延迟扩展**:使用`enabledelayedexpansion`处理动态变量值 5. **输出结果**:最终累计的计数器即为字符串长度 ```bat @echo off setlocal enabledelayedexpansion set "str=HelloWorld" set "count=0" :loop set "tmp=!str:~%count%,1!" if defined tmp ( set /a count+=1 goto loop ) echo 字符串长度为:%count% endlocal ``` ### 关键原理说明 1. **字符串截取**:`%str:~n,1%`表示从第n个位置开始截取1个字符(索引从0开始)[^5] 2. **延迟扩展**:使用`!var!`替代`%var%`实现循环内变量实时更新[^3] 3. **循环控制**:`goto`指令配合标签实现类似`while`循环的效果[^1] ### 注意事项 - 特殊字符处理:字符串包含`!`号时需临时关闭延迟扩展 - 空字符串检测:初始字符串为空时直接返回0 - 最大长度限制:BAT脚本理论上支持最长8192字符字符串[^2]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sjmblog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值