C中的任意长度字符串

2023-11-22

我需要对字符串进行一些操作(例如在某些位置添加字母)。我不知道它的大小是多少,这取决于输入。

如何定义字符串而不指定其大小?我希望它能够适应我放入其中的任何内容。

为什么我不能只传递一个空的char *到一个方法?编译器不允许这样做。

根据答案,我明白我无法创建无限大小的字符串。但例如当我尝试创建时char arr[100]当我打印时,我的字符串长度只有 8 个字符arr我收到的信比我想要的还要多。其中一些甚至不是字符串的一部分。这怎么可能?


简短回答

您不能定义大小未知的字符串。但当需要时,你可以使字符串变得越来越大。所有字符串和 I/O 函数都需要获取已分配的字符串才能使用,因此您必须稍微调整分配并注意不要超出分配的容量。

但是,当字符串长度有一个恒定的上限时,只需分配该长度的字符串就可以了。调整大小比较复杂,因此如果不需要,请避免这样做。

C中的字符串是什么

String 是 char 数组的一部分,以\0。字符串函数在遇到第一个时停止读取数组\0特点。请记住strlen返回字符数before首先\0,所以即使数组在第一个之后立即结束\0,字符串长度严格小于底层数组长度。具体来说,在这种情况下数组长度是strlen + 1。这在分配字符串时很重要;总是为终止分配空间\0!

E.g.

char w[7] = "Hello";

是相同的

char w[7] = {'H', 'e', 'l', 'l', 'o', '\0', '\0'};

当用作字符串时,第一个\0是字符串的结尾,其后的任何内容都将被忽略(字符串函数不会读取)。即使您用可打印字符重写示例 char 数组的最后一个元素(例如w[6] = '!';导致有{'H', 'e', 'l', 'l', 'o', '\0', '!'}), puts(w);将打印Hello (not Hello!或类似的东西)。

当使用字符串和字符数组时,请确保始终包含\0在其末尾,否则在字符串函数读取数组后可能会出现未分配的内存,这会导致segfault.

为什么无法定义未知大小的字符串

正如我已经写过的,字符串是字符数组的一部分。每个数组必须有固定的大小。您可以仅使用其中的一部分(有效地使其更小),但必须对其进行分配和分配器(malloc, calloc)需要知道需要多少内存。

如果您使用的数组大于分配的数组,您的程序可能会崩溃segfault在更好的情况下。如果你非常不幸,你的程序不会崩溃,只会使用数组后面的部分内存,产生奇怪的结果。

从 C99 开始,如果可以的话,您可以省略数组长度规范从初始化器推断: char w[] = "Hello";与以下结果相同char w[6] = "Hello";。但是,这对您没有帮助,因为您在编译时指定了初始值设定项,并且需要在运行时动态更改字符串长度。

如何模拟任意长度的字符串

要处理无限长度的字符串,您可以创建固定长度的数组,每次其长度太低时,分配一个两倍长的新数组,并将原始内容复制到新数组中。 (和free旧的。)你可以使用realloc为您完成这项工作,当阵列不需要移动并且可以就地延长时,还有更高的速度的额外好处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C中的任意长度字符串 的相关文章

  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 如何向 UWP 项目添加 .NET dll 引用?

    我有几个适用于 NETv4 x 的 NET dll 项目 我将版本更改为 4 6 1 并重新构建 没有出现问题 当我尝试从 UWP 项目向它们添加引用时 出现错误 项目的目标是 NETCore 而文件引用的目标是 NET框架 这不是受支持的
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • 在 Windows Phone 上启动 pdf 文件时出现 System.Runtime.InteropServices.COMException

    我正在尝试使用我之前在另一个应用程序上使用过的以下工作代码打开 pdf 文件 但这一次 当流程到达此行时 我收到 System Runtime InteropServices COMException Windows System Laun
  • 当我单击 GridView 项时返回 ImageView 实例

    当我点击GridView项时如何返回ImageView实例 我为 ItemClick 创建自定义绑定事件 public class ItemClickSquareBinding MvxBaseAndroidTargetBinding pri
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 在生产者-消费者情况下使用条件变量

    我正在尝试了解条件变量以及如何在生产者 消费者情况下使用它 我有一个队列 其中一个线程将数字推入队列 而另一个线程从队列中弹出数字 当生产线程放置一些数据时 我想使用条件变量向消费线程发出信号 问题是有时 或大多数时候 它只将最多两个项目推
  • 抽象类和接口之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 接口与基类 https stackoverflow com questions 56867 interface vs base class 我不明白抽象类和接口之间的区别 我什么时候需要使用哪种字体
  • 编写专门用于类及其子类的函数模板

    我正在尝试编写一个函数模板 一个版本应该用于不满足另一版本标准的所有类型 当参数是给定类的基类或该类本身时 应使用另一个版本 我尝试过超载Base 但是当类派生自Base 他们使用通用的 而不是特定的 我也尝试过这种 SFINAE 方法 s
  • C# ToString("MM/dd/yy") 删除前导 0 [重复]

    这个问题在这里已经有答案了 可能的重复 格式化 NET DateTime Day 不带前导零 https stackoverflow com questions 988353 format net datetime day with no
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • 在 MVVM 中,可以在视图后面的代码中访问 ViewModel 吗?

    在 MVVM 模式中 是否可以接受甚至可以访问视图代码后面的 ViewModel 属性 我有一个可观察的集合 它填充在 ViewModel 中 我需要在视图中使用它来绑定到带有链接列表的无限滚动条 IE private LinkedList
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 从 C# 中的 .NET SecureString 读取单个字符?

    WPF 的PasswordBox 返回一个SecureString 它对窥探者隐藏密码 问题是你最终必须获得密码的值 而我在网上找到的建议都涉及将值复制到字符串中 这会让你回到窥探者的问题 IntPtr bstr Marshal Secur
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015
  • 最后从同一类中的其他构造函数调用构造函数

    我在这里读到可以调用另一个构造函数从同一类中的另一个构造函数调用构造函数 https stackoverflow com questions 829870 calling constructor from other constructor

随机推荐

  • 在 Linux 上安装 PyQt5 5.14.1

    pip3 install PyQt5 Collecting PyQt5 Using cached https files pythonhosted org packages 3a fb eb51731f2dc7c22d8e1a63ba88f
  • 设置捆绑值返回 nil

    我向我的应用程序添加了一个 设置 包 在 Xcode 中 它出现在我的项目树视图的根目录中 The Root plist文件看起来像这样
  • 可以对 Julia 代码进行逐行分析吗?

    我有一些长达数百行的 Julia 函数 我想对其进行分析 以便我可以优化代码 我知道基准测试工具包允许使用以下命令测量函数的总体执行时间和内存消耗 btime or benchmark 但这些函数没有告诉我函数内部的瓶颈在哪里 因此 我的第
  • findall/3 在其结果列表中创建新的、不相关的变量

    permutation A B C Z Z A B C Z A C B Z B A C Z B C A Z C A B Z C B A false 说得通 我可以研究以下的排列 A B C 并且该排列包含与中相同的元素 A B C 所以我对
  • 如何禁止两个相互冲突的选项

    有没有办法向 Python 的 ArgumentParser 指定两个可选标志发生冲突 arg parser add argument c clean action store true arg parser add argument d
  • CallExpression 和 MemberExpression 之间的区别

    有什么不同 我看了ECMAScript规范 但不明白 真正的代码示例会有很大帮助 如果你能解释这里的每一行那就太好了 MemberExpression PrimaryExpression FunctionExpression MemberE
  • 检测有向图中循环的最佳算法[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 是否有一种有效的算法来检测有向图中的循环 我有一个有向图 表示需要执行的作业的时间表 作业是节点 依赖项是边 我需要检测该图中导致循环依赖的循环错误情况 Tarjan 的强连通分量算法 h
  • Pandas Dataframe / Numpy 数组“轴”定义中的歧义

    我对 python 轴的定义方式以及它们是否引用 DataFrame 的行或列感到非常困惑 考虑下面的代码 gt gt gt df pd DataFrame 1 1 1 1 2 2 2 2 3 3 3 3 columns col1 col2
  • JavaScript 中的 Console.log 输出

    Why do console log 00 and console log 01 在浏览器控制台中打印 0 和 1 而不是 00 和 01 console log 00 prints 0 console log 01 prints 1 co
  • Flex-box:将最后一行与网格对齐

    我有一个简单的弹性盒布局 其中包含如下容器 grid display flex flex flow row wrap justify content space between 现在我希望最后一行中的项目与另一行对齐 justify con
  • 如何将相同类型的多个参数传递给 jQuery Get

    我正在尝试使用 jQuery get 从网站获取一些数据 我需要设置2个相同类型的参数 q Some Text q Some other text jQuery 似乎用第二个实例覆盖 q 的第一个实例 并且仅发送 1 有什么办法解决这个问题
  • 适用于 iOS 的 WebDav 客户端库 [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有适用于 iOS 的 WebDav 客户端实现 看一下WTclient
  • 当只需要一个字节时,为什么 Rust 使用两个字节来表示这个枚举?

    它似乎足够聪明 只为 A 使用一个字节 但不够聪明 为 B 使用一个字节 即使只有 8 8 64 种可能性 有什么方法可以让 Rust 解决这个问题 还是我必须手动实现更紧凑的布局 游乐场链接 allow dead code enum A
  • Python 3:gzip.open() 和模式

    https docs python org 3 library gzip html 我正在考虑使用gzip open 我有点困惑mode争论 模式参数可以是 r rb a ab w wb x 中的任何一个 或 xb 表示二进制模式 或 rt
  • 检测 32 位或 64 位 Windows

    我想检测当前的Windows操作系统是32位还是64位 如何用C 实现呢 我不需要处理器类型 我想要操作系统的位类型 这是因为您可以在 64 位处理器上安装 32 位操作系统 要调用的函数是IsWow64Process or IsWow64
  • 无会话的 Passport js 身份验证

    我是expressjs和passportjs的初学者 我使用护照和 GoogleStrategy 通过谷歌进行身份验证 使用下面的代码我有req user id 123456 in 用户 你好路由处理程序 但我想得到一些类似的没有会话支持的
  • 如何使用 iCloud 访问 Xcode 项目

    我最近购买了一台 MacBook Pro 我将用它来开发 iPhone 应用程序 我希望能够在 Macbook 和 iMac 之间传输 Xcode 项目 就像使用 iCloud 传输 Word 文档一样 有没有一种安全的方法可以做到这一点
  • 递归关系[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 如何以最佳复杂度计算非常大的 n 例如 10 14 的 tribonacci 数 Tri
  • 帮助理解为什么我们的应用程序在Win7上弹出UAC对话框

    我们有一个 C 非托管应用程序 它似乎会导致 UAC 提示 似乎发生在Win7 而非 Vista 不幸的是 UAC dlg 是系统模式的 所以我无法附加调试器来检查代码所在的位置 并且在 msdev 下运行 我们使用的是 2008 以提升模
  • C中的任意长度字符串

    我需要对字符串进行一些操作 例如在某些位置添加字母 我不知道它的大小是多少 这取决于输入 如何定义字符串而不指定其大小 我希望它能够适应我放入其中的任何内容 为什么我不能只传递一个空的char 到一个方法 编译器不允许这样做 根据答案 我明