首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在C中获取长度未知的char*?[复制]

在C语言中,获取一个char*字符串的长度通常使用strlen函数,但这个函数要求字符串必须以空字符(\0)结尾。如果char*指针指向的字符串没有以空字符结尾,或者你不确定它是否以空字符结尾,那么就不能直接使用strlen

基础概念

  • strlen函数:计算以空字符结尾的字符串的长度,不包括空字符本身。
  • sizeof运算符:计算变量或类型在内存中所占的字节数。

相关优势

  • strlen:简单易用,适用于大多数标准C字符串。
  • 自定义函数:可以处理非标准字符串或二进制数据。

类型

  • 标准C字符串:以空字符结尾的字符数组。
  • 非标准字符串:不以空字符结尾的字符数组或二进制数据。

应用场景

  • 标准字符串处理:使用strlen函数获取长度。
  • 文件读取:从文件读取的数据可能不以空字符结尾,需要自定义函数计算长度。

遇到的问题及解决方法

问题1:char*指向的字符串没有以空字符结尾

原因:可能是从二进制文件读取的数据,或者手动构造的字符串没有正确添加空字符。

解决方法

代码语言:txt
复制
#include <stdio.h>

size_t get_length(const char* str) {
    const char* end = str;
    while (*end) {
        ++end;
    }
    return end - str;
}

int main() {
    char data[] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' }; // 没有空字符结尾
    size_t length = get_length(data);
    printf("Length: %zu\n", length); // 输出长度
    return 0;
}

问题2:char*指向的是二进制数据

原因:处理二进制文件或网络数据时,数据可能包含任意字节,不以空字符结尾。

解决方法

代码语言:txt
复制
#include <stdio.h>

size_t get_binary_length(const char* data, size_t max_length) {
    return max_length;
}

int main() {
    char binary_data[] = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64 }; // 二进制数据
    size_t length = get_binary_length(binary_data, sizeof(binary_data));
    printf("Length: %zu\n", length); // 输出长度
    return 0;
}

参考链接

通过上述方法和示例代码,你可以处理不同类型的char*字符串,并获取其长度。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言——字符函数和字符串函数(一)

一,字符分类函数 C语言里提供一系列的函数专门用于字符分类,便于我们**判断一个字符是属于什么类型的字符** 如islower: int islower(int c) islower就会判断参数部分的...1,基本介绍 我们来看一下C语言官网对它的介绍 ●原文:C字符串的长度是由终止空字符决定:C字符串的长度等于字符串开头和终止字符之间的字符数(但不包括终止字符本身) ●通俗来讲就是:字符串开头到...arr1数组中存放的是:a b c d e \0程序自动在字符串后面补充了\0 arr2数组中存放的是:a b c d e 没有\0,因此strlen会一直找\0找到才停止,输出结果 33 其实是一个随机值...→num(复制的字符的个数) char* strncpy(char* destination, const char* source, size_t num); ●复制num个字符从源字符串到目标空间...2,strncat ⭐区别: ●从源字符串追加num个字符到目标字符串的末尾,追加完以后再追加一个\0 ●如果num>源字符串长度,则只会将源字符串中\0之前的内容追加到目标字符串的末尾**

11910
  • 拿捏住C字符串,这个烦人程度不亚于指针的小东西

    size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。...在C++中,设计size_t 就是为了适应多个平台的。size_t的引入增强了程序在不同平台上的可移植性。...获取,这样比较专业。...,返回负数 //否则,返回0 //可以自己动手写一个,简单的很 ---- strcpy:复制字符串 char* strcpy(char* str1,const char* str2); //其实就是两个指针引用同一个字符串...---- strcat:拼接字符串 char* strcat(char* s1,const char* s2); //第一个参数的地址必须足够长,不然越界了,就是会有未知的风险了 //注意,这些函数的参数类型

    29510

    剑指Java-常用类

    ​ String 类型表示字符串,Java 程序中的所有字符串字面值(如 “ABC” )都作为此类的实例实现。...译文:返回一个字符串,该字符串是该字符串的子字符串 3.1.3.7、获取指定位置的字符 // 获取自定位置的字符 String str1 = "hello"; char c = str1.charAt...,copyOf(int[] original, int newLength) 复制指定的数组,截取或者用0填充,他是直接创建一个新的数组,如果我们指定的数组元素长度不够就素截取,如果长度多余就是用0填充...如果不使用泛型的话,从容器中获取出来的元素,由于我们不知道类型,所以需要强制类型转换 6.2、自定义和使用泛型 定义泛型 ​ 我们可以使用一个标识符,比如T(Type)在类中表示一种未知的数据类型...如果不使用泛型的话,从容器中获取出来的元素,由于我们不知道类型,所以需要强制类型转换 6.2、自定义和使用泛型 定义泛型 ​ 我们可以使用一个标识符,比如T(Type)在类中表示一种未知的数据类型

    89730

    Redis剖析——Redis字符串的设计与实现

    本章分析Redis如何在内存中保存这些字符串。...ptr:指向实际的数据结构,如sds,真正的数据存储在该数据结构中。 lru:24位,LRU时间戳或LFU计数。 redisObject负责装载Redis中的所有键和值。...提示:sdshdr结构体中的buf数组并没有指定数组长度,它是C99规范定义的柔性数组—结构体中最后一个属性可以被定义为一个大小可变的数组(该属性前必须有其他属性)。...【1】获取当前可用空间长度。如果当前可用空间长度满足要求,则直接返回。 【2】sdslen负责获取字符串长度,由于sds.len中记录了字符串长度,该操作复杂度为O(1)。...s_realloc与C语言realloc函数的作用相同,负责为给定指针重新分配给定大小的内存空间。它会尝试在给定指针原地址空间上重新分配,如原地址空间无法满足要求,则分配新内存空间并复制内容。

    81620

    slave_exec_mode=IDEMPOTENT的行为小结

    原文: https://www.jianshu.com/p/bd6f7c3e5b50 slave_exec_mode=IDEMPOTENT 在MySQL复制环境中是个很有用的参数:只要在备机运行set...但官方文档的描述很简洁,我一直好奇slave_exec_mode=IDEMPOTENT 是如何在复制出错时保持一致性的--譬如主键冲突时是简单跳过还是覆写,今天在Percona 5.7下做了个实验(binlog...如这样的insert insert into test set c1='a',c2='b'; 此时insert into语句在备机执行时假如遇到主键冲突就先转化为delete再insert delete....insert into...commit;) 如这样的sql begin;    ...... ...冥等模式并不是万能的,除了不能对DDL操作冥等,对字段长度不同导致的错误也不是冥等(譬如主机一个字段是char(20)而备机是char(10)),还有一个限制就是表有主键才会对insert的冥等设置有效

    90230

    C++ String揭秘:写高效代码的关键

    本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。 一、为什么要学习C++的string类?...1.1 C语言中的字符串 在C语言中,字符串是以'\0'结束的字符数组,需要通过标准库的str系列函数来操作,如strcpy、strlen等。...复杂的操作方式:如拼接、查找、复制等操作需要调用不同的函数,容易出错。 非面向对象:C语言的字符串操作分离于数据本身,不符合现代编程的OOP(面向对象编程)思想。...在string的现代实现中,当数据从一个string对象移动到另一个对象时,只需要移动内存指针,而不是复制整个字符串的内容。...这种优化广泛应用于现代编译器的标准库实现中。 移动语义的应用 移动语义避免了深拷贝带来的性能损失,特别是在字符串长度较大时,移动指针而不是复制所有字符极大提高了程序的执行效率。

    15910

    C++系列笔记(十二)

    • 务必将指针初始化为NULL或有效的地址———如运算符new返回的地址。 • 使用数组时,绝不要跨越其边界。跨越数组边界被称为缓冲区溢出,可导致安全漏洞。...• 不要使用C风格字符串(char*'),也不要使用strelen()和strcopy()等函数。std::string更安全,还提供了很多有用的方法,如获取长度、进行复制和附加的方法。...• 声明和定义接受非 POD 类型作为输入的函数时,应考虑将参数声明为引用,以免调用函数时执行不必要的复制步骤。...• 如果类包含原始指针成员,务必考虑如何在复制或赋值时管理内存资源所有 权,即应考虑编写复制构造函数和赋值运算符。 • 编写管理动态数组的实用类时,务必实现移动构造函数和移动赋值运算符,以改善性能。...对于分配资源的代码,务必处理其可能引发的异常,即将其放在try块中,并编写相应的catch()块。 • 绝不要在析构函数中引发异常。 PS:C++系列已经完结啦![撒花]!

    1.9K30

    初始字符串 & 转义字符与注释

    那么我们就来证明下在字符串数组当中的字符串是不是会存在反斜杠(\0) char arr[] = "hello C"; 从这里可以看出总共有⑦个元素,这里本来只有⑥个字符的。...当我打印的时候arr1数组是因为后面有一个反斜杠(\0)让字符串停下来了,而arr2数组当中没有反斜杠(\0)后面放的是什么我们是完全不知道的。所以,后面空间的内容是未知的。...对于未知的内容,那我们打印的内容自然是不知道的从而打印出来了乱码。而arr1数组当中有反斜杠(\0)的时候那么就知道要停下来了。...: 复制字符串 声明:char *strcpy(char *dest, const char *src) dest – 指向用于存储复制内容的目标数组。...src – 要复制的字符串。 注意:当我们用字符串函数求长度的时候反斜杠(\0)是不算长度的。 当然C语言还有大量的字符串函数,这个等以后会跟大家说的,现在我们知识初始即可!

    1.3K10

    高效的数据压缩编码方式 Protobuf

    在支持指定符号范围之外的值的开放枚举类型的语言中,例如 C++ 和 Go,未知的枚举值只是存储为其基础整数表示。...一个实现可以提供一个选项来覆盖这个行为,并使用它们的默认值输出字段。 忽略未知字段:默认情况下,Proto3 JSON 解析器应拒绝未知字段,但可能提供一个选项来忽略解析中的未知字段。...为此,线性的格式消息中每对的“key”实际上是两个值,其中一个是来自.proto文件的字段编号,加上提供正好足够的信息来查找下一个值的长度。在大多数语言实现中,这个 key 被称为 tag。 ?...如果消息具有未知字段,则当前的 Java 和 C++ 实现在按顺序排序的已知字段之后以任意顺序写入它们。当前的 Python 实现不会跟踪未知字段。...由于文本并不适合用来描述数据结构,所以 Protobuf 也不适合用来对基于文本的标记文档(如 HTML)建模。

    4.7K11

    Redis二进制安全的原理

    标记字符,如转义码,\0结尾的字符串(如C语言中的字符串),不是二进制安全的。 场景 在处理未知格式的数据,例如随意的文件、加密数据及类似情况时,二进制安全功能是必须的。...Redis二进制安全原理 struct sdshdr{ int len;//buf数组中已经使用的字节的数量,也就是SDS字符串长度 int free;//buf数组中未使用的字节的数量...char buf[];//字节数组,字符串就保存在这里面 }; redis通过定义上述结构体的方式,扩展了C语言底层字符串的缺点,字符串长度的获取时间复杂度从原来的O(N)变成了O(1...SDS在Redis中是实现字符串对象的工具。当你对该字符串取值时是通过len属性判断实际内容的长度,然后取的值。拼接字符串时是追加到free空间中的。...Redis的简单动态字符串SDS对比C语言的字符串char*,有以下特性: 可以在O(1)的时间复杂度得到字符串的长度 可以高效的执行append追加字符串操作 SDS通过判断当前字符串空余的长度与需要追加的字符串长度

    3.1K52

    c++注意点

    malloc分配字符串空间时,要长度+1,因为还有字符串结束符/0 eg. this->filePath = (char *)malloc(strlen(filePath) + 1); 字符串复制....hpp 头文件中定义,只能做定义操作,不能new ,一些初始化操作应该放在主程序里或者构造函数里。...函数中,给函数指针参数赋值时,不能赋值指针:data=&data2。...库,在低级gcc下运行; 非法运算,如分母为0等;(首先检查该项,是否有分母为零的情况,如文件路径不正确,由于找不到图片,给出图片总数为0,但内部运算了识别率等用到该图片数作为分母的情况) 写完程序先检查释放资源...* 没赋值,也没赋NULL,会core,因为时野指针,指向的位置安全性未知 free标准代码 if(dataP !

    46430

    Redis使用及源码剖析-2.Redis简单动态字符串(SDS)-2021-1-16

    2.柔性数组简介 C语言标准C99 中,结构中的最后一个元素允许是未知大小的数组,这个元素称为柔性数组,sdshdr中的buf就是柔性数组。...struct sdshdrPtr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间 char *pBuf;...对于第三点,柔型数组使用时一般根据len属性动态分配内存,如分配一个sdshdr对象来存放字符串的代码如下所示: char *pStr = "Redis is too easy!"...1.SDS可以常数时间获取字符串长度 C 字符串并不记录自身的长度信息, 所以为了获取一个 C 字符串的长度, 程序必须遍历整个字符串,对遇到的每个字符进行计数, 直到遇到空字符为止,这个操作的复杂度为...而SDS可以直接读取len成员来获取字符串长度,时间复杂度为O(1)。Redis中获取字符串长度的操作相当普遍,所以采用SDS可以有效提升效率。

    46420

    C语言中的柔性数组 C语言结构体中char和char的用法

    ============================================================ 在日常的编程中,有时候需要在结构体中存放一个长度动态的字符串,一般的做法,是在结构体中定义一个指针成员...C99使用不完整类型实现柔性数组成员,在C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组(flexible array)成员(也叫伸缩性数组成员),但结构中的柔性数组成员前面必须至少一个其他成员...)+100*sizeof(char)); c就是一个柔性数组成员,如果把stpTest指向的动态分配内存看作一个整体,c就是一个长度可以动态变化的结构体成员,柔性一词来源于此。...c的长度为0,因此它不占用test的空间,同时stpTest->c就是“hello world”的首地址,不需要再使用( char * )( stpTest + 1 )这么丑陋的代码了。...3、实际当中的用法      在实际程序中,数据的长度很多是未知的,这样通过变长的数组可以方便的节省空间。对指针操作,方便数据类型的转换。

    2.9K31

    C语言字符串详解

    ;    // 这句话看起来像是字符串复制,其实不是,只是涉及到指针操作 上述语句声明了一个指向 char 类型的指针,并用字符串常量中第 1 个字符的地址对该指针进行初始化。...这个数组的长度实际上为 6 ,因为会自动添加一个字符串结束符 '\0'。 C 语言提供了一种更简洁的方法来对字符数组进行初始化: char charArray[] = "Hello World!"...二、获取字符串长度 字符串的长度就是这个字符串所包含字符的个数,但是这个长度是不包含 NUL 字符的。...C 语言中使用库函数 strlen 来计算字符串长度: size_t strlen(char const *string); 需要注意的是 strlen 的返回值类型:size_t 类型,这是一个无符号整数类型...为了解决这个问题, C 语言中提供了一种更为安全的方式来进行字符串复制操作——strncpy 函数: char *strncpy(char *dst , char const *src , size_t

    3.7K88

    从零开始:C++ String类的模拟实现

    引言 在C++编程中,字符串操作是非常常见且重要的任务。标准库中的std::string类提供了丰富且强大的功能,使得字符串处理变得相对简单。...通过这篇文章,您将学到如何在C++中进行动态内存分配和管理,如何实现深拷贝和移动语义,如何重载运算符以提升类的易用性,等等。...我们讨论了深拷贝和移动语义的区别,以及如何有效地管理资源。 基本成员函数 我们实现了获取字符串长度的 length 函数和返回 C 风格字符串的 c_str 函数。...这些函数使我们的 String 类更实用,并与 C++ 标准库中的 std::string 类的行为保持一致。...通过实现这个自定义的 String 类,我们不仅学会了如何在 C++ 中操作字符串,还增强了我们的面向对象编程技能和内存管理能力。

    8010

    c#知识点1.0数据类型

    对象的引用也可以用于反射,此时必须有代码来处理类型未知对象,类型c++的void指针 2.0 对象类型执行许多一般用途的基本方法,包括Equals(),GetHashCode(),GetType(),...ToString().用户定义的类需要重写 字符串类型 在c字符串是一个字符数组,c++字符串一个对象,c#提供了自己的数据类型,字符串保存在堆中,因此把字符串复制给另一个字符串,会得到对内存同一个字符串二次引用...Console.WriteLine("char的长度:{0} ,ch={1}", sizeof(char),ch); Studen stu; stu.name...:1 byte的长度:1 short的长度:2 ulong的长度:8 d=1.123456 char的长度:2 ,ch=东 东风冷雪 666 我喜欢的颜色是:white 姓名:东风冷雪,身高:1.72,...参考文章: c#中的数据类型简介 二维数组打印

    1.2K70

    66个让你对Rust又爱又恨的场景之一:变量与值

    首先是安全性,C++缺乏Rust的所有权系统和借用检查器,可能导致一些内存安全问题。其次是未定义行为,C++允许一些可能导致未定义行为的操作,如返回局部变量的引用,这在Rust中是被禁止的。...首先是当数据大小在编译时未知时。其次是当需要数据在多个作用域间共享时。最后是实现递归数据结构如链表或树时。如代码清单3所示。...动态数组:Vec的长度是可变的,可以根据需要动态增加或减少元素。高效:Vec在堆上分配内存,并且通常会预留比当前需要更多的空间,以减少频繁的内存分配和复制操作。...灵活:可以存储任何类型的元素,只需在声明时指定类型参数。例如,Vec表示存储i32类型的整数。方便:提供了丰富的方法,例如push(添加元素)、pop(移除元素)、len(获取长度)等。...在C++中,堆上值包括使用new运算符动态分配的对象或数组、标准库容器(如std::vector、std::string和std::map等)以及任何在运行时需要动态分配内存的数据结构。

    50073

    C风格字符串

    例如数据库的接口函数,如MYSQL,只有C语言版本,没有C++版本。 在实际开发中,C的库函数和Linux的库函数不可能不用,还有,开源库对C++程序员很重要,可以节省很多时间。...所以如果打算深入的学习C++,必须掌握C风格的字符串。 C语言约定:如果字符型(char)数组的末尾包含了空字符\0(也就是0),那么该数组中的内容就是一个字符串。...前n个字符的内容复制到dest中。...所有操作字符串的操作,每次操作前都要清空。 5、获取字符串的长度 strlen() size_t strlen(const char * str); 功能:计算字符串的有效长度,不包含0。...e)在VS中,如果要使用C标准的字符串操作函数,要在源代码文件的最上面加 #define _CRT_SECURE_NO_WARNINGS (一些的ide环境(如vs2022

    26200

    C++ 练气期之细聊字符串

    1.2 存储结构 字符常量必须用单引号包起来,字符直接存储在变量中。 char myChar='A'; 字符串的存储方案比字符复杂很多,C++支持两种字符串的存储方案: C语言风格的存储。...C++规定在使用{}进行字面值初始化数组时,{}内的实际数据个数不能大于数组声明的长度。 当不确定字符串的长度时,可以采用省略[]中数字的方案。...2.3.1 复制操作 C++中数组之间是不能直接赋值的,如下是错误的: char myStr[6]="HELLO"; char myStr_[6]; //错误 myStr_=myStr; 可以使用cstring...其作用是,把源字符串复制给目标字符串。 2.3.2 长度操作 使用 strlen函数计算字符串的长度。...获取字符串的常规信息:如长度、是否为空…… string str="Hello World"; cout<<str.size()<<endl; cout<<str.length()<<endl; //是否为空

    1.3K20
    领券