首页 > 其他分享 >strlen计算字符串长度

strlen计算字符串长度

时间:2024-10-12 20:20:06浏览次数:12  
标签:字符 空字符 arr2 arr1 字符串 长度 strlen

string length

strlen 是 C 语言标准库中的一个函数,用于计算字符串的长度,不包括终止符 \0。在 Visual C++(VC)中,你可以直接使用这个函数。只需要包含头文件 <cstring>(在 C++ 中)或 <string.h>(在 C 中),然后就可以调用 strlen 函数了。 例如,在 C++ 中使用 strlen 的代码如下:

#include <iostream>
#include <cstring> // 包含strlen函数的头文件
int main() {
    const char* str = "Hello, world!";
    size_t length = strlen(str);
    std::cout << "The length of the string is: " << length << std::endl;
    return 0;
}

在 VC 中,strlen 函数是可以正常工作的。

这段代码是用C++编写的,但它包含了C语言的标准库函数 printfstrlen。代码定义了两个字符数组 arr1arr2,分别以两种不同的方式初始化,并使用 strlen 函数计算它们的字符串长度。下面是对这段代码的详细注释:

#include <iostream> // C++标准输入输出库的头文件
#include <cstring>  // 包含C语言字符串处理函数的头文件,包括strlen


int main() 
{
    // 定义一个字符数组arr1,并以字符串字面量的形式初始化
    char arr1[] = "abc";
    // 这种初始化方式会在末尾自动添加一个空字符'\0'作为字符串的结束标志

    // 定义另一个字符数组arr2,以单个字符的形式初始化
    char arr2[] = {'a', 'b', 'c'};
    // 这种初始化方式不会自动在末尾添加空字符'\0',因此它不是一个以'\0'结尾的字符串

    // 使用strlen函数计算arr1的长度,strlen会统计直到遇到第一个'\0'之前的字符数量
    printf("%d\n", strlen(arr1)); // 输出3,因为arr1包含三个字符和一个隐含的'\0'

    // 使用strlen函数计算arr2的长度,由于arr2没有显式的'\0',strlen可能会越界访问内存
    printf("%d\n", strlen(arr2)); // 输出不确定的值,取决于arr2后面紧跟的内存内容

    return 0; // 主函数正常结束,返回0
}

在这段代码中,arr1 是一个以空字符结尾的字符串,因此 strlen(arr1) 会返回3,即字符串中的字符数量。然而,arr2 并不是一个以空字符结尾的字符串,因此 strlen(arr2) 的结果是不确定的,因为它会继续搜索内存,直到找到一个空字符为止。这可能导致未定义的行为,包括输出一个意外的值或者程序崩溃。

代码展示了 strlen 函数在 C++ 中的使用,同时也指出了一个潜在的问题:

  1. char arr1[] = "abc"; 这行代码定义了一个字符数组 arr1,并初始化为字符串 "abc"。由于使用了双引号,编译器会自动在字符串的末尾添加一个空字符 \0 作为字符串的结束标志。
  2. char arr2[] = {'a', 'b', 'c'}; 这行代码也定义了一个字符数组 arr2,但是它是用单个字符初始化的,没有自动添加空字符 \0
  3. 当你使用 strlen(arr1) 时,它会计算到空字符 \0 为止,因此返回长度为 3。
  4. 但是,当你使用 strlen(arr2) 时,由于数组中没有空字符 \0strlen 函数会继续向后查找,直到找到一个空字符为止。如果 arr2 后面的内存中没有空字符,strlen 可能会读取到不属于 arr2 的内存,这可能导致未定义的行为,包括返回一个错误的长度,甚至程序崩溃。 正确的做法是确保所有用作字符串的字符数组都以空字符 \0 结尾。所以,如果你想要 arr2 作为字符串使用,你应该这样定义它:
char arr2[] = {'a', 'b', 'c', '\0'};

为了避免这种情况,如果你想要将 arr2 作为一个字符串来处理,你应该手动在其末尾添加一个空字符:

'\0'

这样,strlen(arr2) 就会返回3,与 arr1 相同。

.记得,在处理字符串时,确保它们以空字符结束是非常重要的。


标签:字符,空字符,arr2,arr1,字符串,长度,strlen
From: https://blog.51cto.com/u_17048808/12231728

相关文章

  • Java将数组转换成字符串
    Java将数组转换成字符串1.使用Arrays.toString()对于一维数组,可以使用java.util.Arrays类中的toString()方法:importjava.util.Arrays;publicclassMain{publicstaticvoidmain(String[]args){int[]nums={1,2,3,4,5};String......
  • 【C语言】语义陷阱(5):揭秘空指针与空字符串的微妙差异
    目录一、空指针(NullPointer)1.1.定义与表示1.2.用途1.3.安全性 1.4.注意事项1.5.空指针与野指针的区别1.5.1.特性对比1.5.2.安全性与风险1.5.3.编程实践二、指向空字符串的指针2.1.定义2.2.字符数组与空字符串2.3.指针的初始化2.4.空字符串的用途2......
  • c语言模拟实现库函数 strlen strcpy strcat strcmp strstr
    一、模拟实现库函数strlen解释:strlen是求字符串长度的,求出的长度是不可能为负数所以返回类型设置为size_t也是合情合理的 typedefunsignedintsize_t\注意字符串已经'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包含'\0')。size_......
  • 20241011-1 字符串函数自写
    #include<stdio.h>#include<string.h>unsignedintmystrlen(char*str){ unsignedintcount=0; while('\0'!=*(str++)) { count++; } returncount;}/*str1:目的字符串str2:源字符串*/voidmystrcpy(char*str1,char*str2){ ch......
  • shell 怎么获取参数的长度
    在这个示例中,${#param}会返回变量param的长度。这里param是脚本的第一个参数,即$1。如果你想获取特定参数的长度,只需将param替换为相应的变量,例如$2表示第二个参数,以此类推。完整示例脚本如下:shell#!/bin/bash#打印所有参数echo"Allparameters:$*"#打印所有参数,以......
  • 获取字符串的在html页面上的宽度并且若文字过长则缩小字体填充
    某个页面有这样一个需求:一个固定宽度的div,若文字过长,则缩小字体填充。看到同事采用的是用php的GD库的imagettfbbox函数来计算文字的宽度。imagettfbbox(float $size,float $angle,string $font_filename,string $string,array $options=[]): array|false 取得使用Tru......
  • resultmap返回字符串set集合
    在resultmap中写好数组实体层的set集合(不用list是因为要去重,要用list的话把set改为list,再下面的sql查询把DISTINCT去掉就可)这里的selectCategoryNumber对应图一中的selectCategoryNumberwhere语句中的recods_id对应图一的column的recods_id最后只要再定义的resultmap......
  • C++删除字符串中的所有空格与换行(任意字符)
    删除字符串中的所有空格与换行使用头文件中的remove函数,注意:std::remove不会改变容器的大小,它只是将元素移动到容器的末尾。因此,我们需要调用erase来实际从字符串中删除这些元素。使用std::remove算法,它重排元素,使得要删除的元素(在这里是空格和换行符)被放在序列的末尾,......
  • Leetcode 839. 相似字符串组【附并查集模板】
    1.题目基本信息1.1.题目描述如果交换字符串X中的两个不同位置的字母,使得它和字符串Y相等,那么称X和Y两个字符串相似。如果这两个字符串本身是相等的,那它们也是相似的。例如,”tars”和“rats”是相似的(交换0与2的位置);“rats”和“arts”也是相似的,但是“s......
  • 多层嵌套json字符串(jsonStr)写入redis
    1、连接redisJedisjedis=newJedis("localhost",6379);2、将字符串转为json格式JSONObjectjs=JSONObject.fromObject(jsonStr);3、对json格式进行解析4、将json写入redispublicstaticvoidRedisSet(JSONObjectjs,Jedisjs01){//获取json中的所有key......