精华内容
下载资源
问答
  • 以下表示可变长度字符串
    2021-05-19 08:18:26

    C语言怎么实现可变长度字符串

    关注:149  答案:3  手机版

    解决时间 2021-02-09 17:22

    提问者北墓南笙

    2021-02-09 04:15

    比如C# 写了个配置文件 不管多长都声明一个string变量用StreamReader下的方法载入进入

    貌似C语言没这样的懒方法 那该怎么做呢

    最佳答案

    二级知识专家一个狠有粪量的人

    2021-02-09 05:01

    char * p = (char*)malloc(sizeof(char)*n)别忘了free

    C++和C#的string类型在最低层实际也是利用类似方法去做的

    另外有一种

    char str[SIZE_MAX]也有人喜欢用

    realloc函数

    只是不太推荐,主要原因是以前系统上这个函数操作会出问题,因为内存的原因

    全部回答

    1楼没仙气的仙女

    2021-02-09 05:30

    C语言实现可变长度字符串,主要依靠realloc函数实现,主要代码如下,

    //程序功能,判断插入字符长度len,若大于预设大小n,调整字符串数组大小,实现动态处理数组大小。

    #include

    #include

    #include

    int main(int argc, char *argv[])

    {

    char * pstr = NULL;

    int n=10;//字符串初始大小

    char str[100];//待插入字符串

    int len=0;//待插入字符串长度

    pstr = (char*)malloc(sizeof(char)*n);//申请sizeof(char)*n个大小的内存空间

    if (pstr==NULL)

    {

    printf("内存申请出错,程序退出!\n");

    exit(1);

    }

    memset(pstr,'\0',sizeof(char)*n);//初始化内存空间

    printf("输入待插入字符串:\n");

    gets(str);

    len=strlen(str)+1;

    printf("内存申请出错,程序退出!%d\n",len);

    if(len>n)//字符串长度大于初始大小n,重新申请内存空间

    pstr=(char *)realloc(pstr,sizeof(char)*len);//重新申请内存空间

    strcat(pstr,str);//将插入字符串连接给pstr

    puts(pstr);

    if (pstr==NULL)//清理申请内存

    {

    free(pstr);

    pstr=NULL;

    }

    return 0;

    }

    void *realloc( void *ptr, size_t size );函数将ptr指向的储存空间改变为给定的大小size。 参数size可以是任意大小,大于或小于原尺寸(需要注意的是原始数据会丢失)都可以。返回值是指向新空间的指针,如果错误发生返回NULL。

    2楼失心瘋

    2021-02-09 05:14

    //运用指针运算

    int istrlen(char * str)

    {

    char *p = str;

    int len = 0;

    if(p == null)

    {

    printf("the string is null!");

    return -1;

    }

    while(*p++ != '\0')

    {

    len++;

    }

    return len;

    }

    void main()

    {

    char str[] = "fdasjfkldjs";

    int len = istrlen(str);

    printf("string %s len is%d\n", str, len);

    }

    //调用系统函数int strlen(char*);

    #include "string.h"

    void main()

    {

    char str[] = "fhdlsjklfjds";

    int len = strlen(str);

    printf("string %s len is %d\n", str, len);

    }

    我要举报

    如以上信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!

    推荐资讯

    大家都在看

    更多相关内容
  • 本文描述的算法设计为在O(n)时间内对可变长度字符串进行排序。
  • 密码学 用于加密和解密可变长度字符串的简化类
  • TIA博途WINCC的触摸屏VB脚本入门(Len函数获取字符串长度以及Right和Left函数)
  • 本文主要探讨数据库可变字符串类型长度设计问题,最好的策略是只分配真正需要的空间,慷慨是不明智的。

    转载请注明原创出处,谢谢!

    HappyFeet的博客

    varchar 类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型更节省空间,因为它仅使用必要的空间(例如:越短的字符串使用越少的空间)。

    本文基于 MySQL 数据库进行探讨。

    MySQL 版本为:Server version: 5.7.16 MySQL Community Server (GPL)。


    1、varchar 的长度分配问题

    一直对数据库的可变长字符串的长度分配问题存在疑问:不知道应该分配多长。

    今天我们就来看看 varchar 的长度是依据什么来判断的?

    • 有的人说:“属性有多长,就分配多长”。 ---- 即只分配真正需要的空间

    • 也有人说:“属性的长度应为 4 的倍数,因为这样可以做到内存对齐”。 ---- 即分配为 4 的倍数的长度,可以内存对齐

    • 另一些极端的人觉得:“既然对于 varchar 来说,越短的字符串使用越少的空间,那么这个长度定大一些也不会有什么问题,都分配 4000 的长度,这样可以避免出现超过长度的数据存不进去的问题”,即不管属性长度如何,都分配一个很大的长度,例如:4000.

    那到底哪一种说法是对的呢?

    我们来看个例子,假设我们要建一张表来存 CSDN 个人资料中的三条属性:昵称、地区和简介。下面有三个版本的建表语句,分别针对不同的说法所创建的。

    -- 版本 1:只分配真正需要的空间
    create table user_info (
    	user_id 		long primary key,
    	nickname 		varchar(20),
    	region   		varchar(100),
    	introduction 	varchar(500)
    );
    
    -- 版本 2:在版本 1 的基础上调整为 4 的倍数
    create table user_info (
    	user_id 		long primary key,
    	nickname 		varchar(32),
    	region   		varchar(128),
    	introduction 	varchar(512)
    );
    
    -- 版本 3:长度都取 4000
    create table user_info (
    	user_id 		long primary key,
    	nickname 		varchar(4000),
    	region   		varchar(4000),
    	introduction 	varchar(4000)
    );
    

    经过查阅众多资料之后,得出结论:版本 1 是最好的,即只分配真正需要的空间

    2、结论分析

    下面就来说一下为什么:

    (1)varchar 需要 1 或 2 个额外字节记录字符串的长度

    如果列的最大长度小于或等于 255 字节,则只使用 1 个字节表示,否则使用 2 个字节。假设采用 latin1 字符集,一个 varchar(10) 的列需要 11 个字节的存储空间。varchar(1000) 的列则需要 1002 个字节,因为需要 2 个字节存储长度信息。

    (2)内存对齐 确实有一定的性能提升,但是通过将字段长度定义为 4 的倍数做不到内存对齐

    对于 varchar 类型来说,字符串是变长的,它的实际存储长度为:1 或 2 个额外字节 + 字符串实际长度。举几个例子:

    a、往 varchar(8) 中存入 "abcdefgh",实际存储长度应该为 1 + 8 = 9 个字节,第一个字节记录这个字符串的长度;

    b、往 varchar(8) 中存入 "abc",实际存储长度为 1 + 3 = 4 个字节。

    c、往 varchar(1000) 中存入 "abc",实际存储长度为 2 + 3 = 5 个字节。

    说到内存对齐就简单提一下 MySQL 存储引擎 InnoDB 的数据页结构:page 是 MySQL 管理存储空间的基本单位,它由一条或多条 row 组成,row 就对应于 table 的一条记录,数据读取也是基于 page 来的,而不是一行一行的读。更多详情见:InnoDB数据页结构

    (3)MySQL 在解决某些类型的查询时需要创建隐式临时表(又分为内存临时表和磁盘临时表)

    对于临时表中的字段,MySQL 都会分配一个足够长的定长空间来存放。这个定长空间必须足够长以容纳其中最长的字符串,例如,如果是 varchar 列则需要分配其完整长度,如果使用 UTF-8 字符集,那么 MySQL 将会为每个字符预留三个字节。

    假设我们在查询 user_info 的时候触发了隐式临时表的创建,对于 nickname 这一列,如果我们使用版本 1的建表语句,MySQL 按照完整长度,每条记录仅需要分配 20 的内存,而如果是版本 3的话,每条记录却需要分配 4000 的长度!!!很明显,这是一个非常糟糕的设计。

    MySQL 在以下几种情况会创建临时表(不过这不是本文的重点!)

    • UNION 查询;

    • 用到 TEMPTABLE 算法或者是 UNION 查询中的视图;

    • ORDER BY 和 GROUP BY 的子句不一样时;

    • 表连接中,ORDER BY 的列不是驱动表中的;

    • DISTINCT 查询并且加上 ORDER BY 时;

    • SQL 中用到 SQL_SMALL_RESULT 选项时;

    • FROM 中的子查询;

    • 子查询或者 semi-join 时创建的表;

    (4)预分配内存空间的问题

    注意,这一点存疑!这个说法我目前还没有找到具体的源码或文档说明,不过如果有预分配内存的话,那应该是说得通的,待找到依据再对这一点进行更新

    这个和第三点有点类似,只是第三点讲的是在数据库内部引擎中,而这里讲的是客户端从数据库引擎获取数据。简单来说就是,对于一个 varchar(1000),客户端的 executor 在没拿到存储引擎存储的数据之前,并不会知道我这一行拿出来的数据到底有多长,可能长度只有 1,可能长度是 800,那怎么办呢,那就只能先把最大空间分配好了,避免放不下的问题发生,这样实际上对于真实数据较短的 varchar 确实会造成空间的浪费。举例:如果我有 1000 个 varchar(1000),但是每个只存一个字符,那么真实数据量其实只有 1K,但是我却需要 1M 的内存去适应它。

    (5)字段长度能够起到一定的约束作用

    比如一个字段长度最大不超过 10 个字节,那我们就可以将其设置为 varchar(10),如果超过了 10 个字节,就说明这是个脏数据,这对实际数据能起到一定的约束。

    (6)数据库对于索引的字段长度有限制,在长的数据列上建索引可能会报错,例如

    mysql> create table long_length_table(
        -> long_column1 varchar(2000),
        -> long_column2 varchar(2000),
        -> long_column3 varchar(2000),
        -> long_column4 varchar(2000),
        -> long_column5 varchar(2000)
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table short_length_table(
        -> short_column1 varchar(10),
        -> short_column2 varchar(10),
        -> short_column3 varchar(10),
        -> short_column4 varchar(10),
        -> short_column5 varchar(10)
        -> );
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> create index short_length_table_idx on short_length_table(short_column1, short_column2, short_column3, short_column4);
    Query OK, 0 rows affected (0.02 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> create index long_length_table_idx on long_length_table(long_column1, long_column2, long_column3, long_column4);
    ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes
    

    3、总结

    在 varchar(30) 和 varchar(1000) 存入 “ab”,使用的存储空间区别不大,无非就是一个使用 1 个字节记录字符串的长度,另一个使用 2 个字节记录。但是对于在某些 case 下,varchar(1000) 的性能会比 varchar(30) 差很多,内存消耗也会成倍增加。

    另外,将长度调整为 4 的倍数(内存对齐)会提高性能这种说法也是不对的。

    所以得出的结论是: 只分配真正需要的空间

    PS:以后终于可以理直气壮的跟别人讲:varchar 的长度不宜过长,满足长度要求即可;也不必强行将长度设置成 4 的倍数,这对性能提升是没有效果的。_

    参考资料:

    (1)《高性能 MySQL》第三版.

    (2)MySQL - varchar length and performance

    (3)What are the current best practices concerning varchar sizing in SQL Server?

    (4)Best practices for SQL varchar column length

    (5)Would using varchar(5000) be bad compared to varchar(255)?

    (6)What are the optimum varchar sizes for MySQL?

    (7)MySQL: Disk Space Exhaustion for Implicit Temporary Tables

    (8)File Space Management

    (9)InnoDB数据页结构

    展开全文
  • StringBuilder可变长度字符串什么是可变长度字符串为什么需要StringBuilderStringBuilder的使用 什么是可变长度字符串 StringBulder类在java.lang包下,该类维护一个可变长度字符串。它本身并不是字符串,二十提供...

    什么是可变长度字符串

    StringBulder类在java.lang包下,该类维护一个可变长度字符串。它本身并不是字符串,二十提供维护字符串功能的API

    为什么需要StringBuilder

    因为String类型对象不可变,在频繁修改时性能低下哎,内存开销大,所以在频繁修改字符串时,需要避免使用String类型。
    例如:

    package com.tedu.String;
    
    /**
     * 循环修改字符串的性能问题
     * @author Wildmess
     *
     */
    public class StringBadDemo {
    	public static void main(String[] args) {
    		String s = "a";
    		for(int i=0; i<1000000; i++) {
    			s += "a";
    		}
    		System.out.println("程序结束!");
    	}
    }
    

    这段程序中,每执行一次,都要在字符常量池中创建一个常量,如最开始创建"a",第一次"aa",第二次"aaa"……,依次类推,最终一定会把内存填满,报出异常。
    不过这里一般不会报出,因为Java自带的垃圾回收机制,暂时不会报出异常,最多就是编译时间过长。
    可以把s += “a”;换成s += s;几何速度增长下必定可以看到具体的报错异常。
    在这里插入图片描述

    StringBuilder的使用

    对频繁修改的字符串创建StringBuilder对象,进行检验
    如修改上述程序后为:

    package com.tedu.String;
    
    /**
     * 使用StringBuilder对象完成对字符串的频繁修改
     * @author Wildmess
     *
     */
    public class StringBuilderDemo {
    	public static void main(String[] args) {
    		StringBuilder sb = new StringBuilder("a");
    		for(int i=0; i<100000; i++) {
    			sb.append("a");
    		}
    		System.out.println("程序结束!");
    	}
    }
    
    展开全文
  • 演示如何将字符串的 MATLAB 元胞数组作为可变长度字符串写入/读取 HDF5 文件。 示例还演示了如何使用分块设置无限长度的数据集,以便它可以处理元胞数组中的任意数量的元素。 我还没有看到任何人这样做的证据。 我...
  • MySQL:字符串类型

    千次阅读 2021-01-27 20:47:35
    字符串型: set , enum , blob , text , varchar , char。1. char (字符)格式:char(M) 固定长度M 表示严格限定的长度。char(5)varchar(5)''5字节1字节需要一个字节,保存字符串的总... varchar(字符串)格式:va...

    字符串型: set , enum , blob , text , varchar , char。

    1. char (字符)

    格式:char(M)  固定长度

    M 表示严格限定的长度。

    char(5)

    varchar(5)

    ''

    5字节

    1字节

    需要一个字节,保存字符串的总长度

    'abc'

    5

    4

    'abcde'

    5

    6

    'abcdef'

    超出限制,插入不成功

    插入不成功

    效率相对高

    空间控制好

    2. varchar(变长字符串)

    格式:varchar(M)   可变长度

    M 表示允许的最大长度。

    预留了一个字节,保存字符串的长度。

    当读取了该长度的字符串时,便不再继续读取了。

    eg. 当存固定长度的字符串(如 身份证号,手机号码),使用char ,速度快,不会造成空间的浪费;

    tip: M 表示的是字节数,而不是字节数。

    但总的长度是按照字节数计算的。

    真实的varchar长度:总长度65535,

    varchar的特点:当类型数据超过255个字符时,采用2个字节表示长度。

    因此65535 - 2 = 65533 。

    另外,整条记录需要一个额外的字节,用于保存当前哪个字段是null值。

    除非所有字段都不是null,这个字节才可以省略。

    1 create tables_1(2 a varchar(65533) not null //所有字节都不是null,不需要保存null值

    3 )character setlatin1;4

    5 create tables_2(6 a varchar(65532) //65535中,2个字节保存长度,1个字节保存当前哪个字段是null值7 )character set latin1;

    而当table中有其他的列时,

    tinyint本身占1字节,varchar需要2字节保存自身的长度。若二者都是not null,那可以省去保存null的字段,

    varchar可以占用65535 - 1 - 2 = 65532,如下图第一张所示:

    f5fc74d6ceb95ad42a2433c9a1e89b0c.png

    若a、b中任何一个不写not null,则保存null的字段就必须存在,占用1个字节,此时varchar最大只能是65532 - 1 = 65531。

    947747a3d5ae1fadb4c792834a4790e0.png

    8831a5efc6c2c1df80d1feafd995b579.png

    展开全文
  • 转自:1.varchar类型的变化MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了...
  • 字符串:可变字符串与不可变字符串

    千次阅读 2016-04-23 00:01:35
    一 NSString是不可变字符串,所有它所有产生其他字符串方法都是生成一个新的字符串,而不会改变原来字符串 第一种:字面量,它是常量字符串,存储常量区 NSString *str = @"abc"; 第二种是通过 快捷的构造...
  • 可变字符串与不可变字符串

    千次阅读 2018-10-06 22:04:10
    字符串: java将字符串直接面向对象了,形成的类就是字符串类,表示方法:" " ...注意:可变字符串与不可变字符串的直接父类都是Object,他们之间是兄弟,没有任何关系. 不可变字符串本...
  • SQL固定长度字符和可变长度字符

    千次阅读 2021-10-31 15:46:34
    1) 定义: char: 固定长度,存储ANSI字符,不足...nvarchar(n) :包含 n个字符可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零
  • 可变字符串

    千次阅读 2019-05-31 14:24:28
    可变字符串 :改变字符串,不会产生新的对象 StringBuffer:所有方法synchronized(锁),安全、效率低 StringBuilder:不安全、效率高 StringBuilder sb = new StringBuilder();// "" sb = new StringBuilder(...
  • 字符串学习 定义:java将于字符串相关的类容面向的对象...1、不可变字符串 定义: String:说的是字符串本身没有发生变化,与引用无关- - -常量。 表示方法:String s1 = “1000phone”; 实例代码: public c...
  • ocaml-bitpath:有效的位字符串类型以及用于对可变长度字符串上的数据进行分区的容器
  • java之可变字符串

    2021-01-21 20:00:47
      StringBuffer和StringBuilder都是带有缓冲区的可变字符串,就是存放字符串的一段空间内,其内容可以被修改。    一个String对象的长度是固定的,不能改变它的内容,也不能附加新的字符至String对象中。可以...
  • java可变字符串

    千次阅读 2017-11-21 11:06:23
    在Java5 中提供了变长参数(varargs),也就是在方法定义中可以使用个数不确定的参数,对于同一方法可以使用不同个数的参数调用,例如print("hello");print("hello","lisi");...表示可变长参数,例如 print(S
  • C++中字符数组处理可变字符串

    千次阅读 2015-09-04 10:16:46
    核心思路: 模拟c 中realloc()函数 , 但长度不够时, new 一个更大的数组, 老的数据拷贝过来, 老的空间释放掉, 老的指针指向新的空间 有一点要注意: 这里使用的输入是cin.get() ,因为直接cin>>temp 会将空格...
  • 实现可变长度字符串的类

    千次阅读 2015-11-11 17:30:51
    实现可变长度字符串的类
  • 是否可以初始化一个可以保持字符串的numpy recarray,而不知道字符串长度呢?作为(设计)的例子:mydf = np.empty( (numrows,), dtype=[ ('file_name','STRING'), ('file_size_MB',float) ] )问题是我正在使用信息...
  • 在python中如何获取字符串长度

    万次阅读 2020-11-20 18:16:19
    Python中的字符串是Unicode代码点的不可变序列。给定一个字符串,我们就可以找到它的长度。例:输入:'你好世界!'输出:5输入:'你 好 !'输出:5下面我们就来介绍在python中计算字符串长度,并输出长度的4种方法。...
  • 本章开始进入SQL学习阶段,涉及的知识点如下:数据库和SQL的基本概念数据库安装问题表的创建、删除和更新相关报错问题SQL...- 与多人共享数据- 提供操作大量数据所需的格式- 无需高超的编程技术就可以使用- ...
  • scala 字符串函数Scala String can be defined as a sequence of characters. Today we will look into String concatenation, substring and some other Scala string functions. Scala字符串可以定义为字符序列。 ...
  • C语言中求字符串长度的函数的几种实现方法1.最常用的方法是创建一个计数器,判断是否遇到‘\0',不是'\0'指针就往后加一。int my_strlen(const char *str){assert(str != NULL);int count = 0;while (*str != '\0'){...
  • 在Python中字符串是Unicode代码点的不可变序列。给定一个字符串,我们如何查找它的长度?本篇文章就来给大家介绍在Python中查找字符串长度的四种方法,希望对大家有所帮助。【相关视频教程推荐:Python视频教程】...
  • 基础场景见上面两个帖子,这里单独说明字符串和可变长度字符串的用法。 话不多说,开始今天的演(表)示(演) Profile和插件开发 添加一个string类型的属性: 在插件里添加一条数据上报消息:(已添加一个...
  • 为了巩固学习,脱离智能提示,不是在xcode中编辑,是在文本格式下创建 1.创建对象 NSString *str1 = [...//根据指定格式创建字符串对象 NSLog(@"%@",str1); NSString *str2 = [NSString stringWithFormat:@"%d",

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 351,521
精华内容 140,608
热门标签
关键字:

以下表示可变长度字符串