- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道,有什么好的/有效的方法来分隔基本上可以包含任何字符的字符串。例如,我需要连接n个字符串,它们看起来像:
char *str_1 = "foo; for|* 1.234+\"@!`";
char *str_n = "bar; for|* 1.234+%\"@`";
char *str_final = "foo; for|* 1.234+\"@!`bar; for|* 1.234+%\"@`"; // split?
最佳答案
因为我的评论越来越长,这里有一个完整的答案:
缓冲区应该将字符串的长度存储在前x个字节中(就像pascal那样)。在该长度之后是字符串数据,它可以包含您喜欢的任何字符。之后,接下来的x字节告诉您下一个字符串的长度。以此类推,直到结束,它由一个空字符串分隔(即最后的x字节声明下一个字符串的长度为零,而您的应用程序将此作为停止查找更多字符串的信号)。
一个好处是,您不需要扫描字符串数据-从第一个字符串的开头查找下一个字符串需要O(1)时间,查找列表中有多少字符串需要O(n)时间,但仍然会非常快(如果O(n)是不可接受的,您可以解决这个问题,但我觉得现在不值得谈这个问题)。
另一个好处是字符串数据可以包含您喜欢的任何字符。这可能是一个con—如果字符串可能包含nul字符,则可以安全地提取它,但必须小心不要将其传递给c string函数(如char *
或strlen()
),该函数将把nul字符视为数据的结尾(可能是,也可能不是)。您将不得不依赖strcat()
和指针算法。
问题是x的值(用于存储字符串长度的字节数)。最简单的方法是1,它将绕过所有的endianness和alignment问题,但将字符串限制为255个字符。如果这是一个你可以忍受的限制,很好,但255似乎有点低。
x可以是2个或4个字节,但您需要确保您的数据类型(无符号)至少有那么多字节(memcpy()
'sstdint.h
oruint16_t
,or mayuint32_t
oruint_least16_t
)。更好的解决方案是生成uint_least32_t
,因为X = sizeof(size_t)
类型保证能够存储任何想要存储的字符串的长度。
如果网络可移植性是一个问题,使用size_t
将引入对齐和端性。将前x个字节作为X > 1
变量读取的最简单方法是将size_t
数据转换为char *
并取消引用。但是,除非您能保证size_t *
数据正确对齐,否则在某些系统上会中断。即使您确实保证了char *
数据的对齐,也必须在大多数字符串的末尾浪费几个字节,以确保下一个字符串的长度值对齐。
克服对齐的最简单方法是手动将第一个char *
字节转换为sizeof(size_t)
值。你必须决定你是希望数据以小尾数还是大尾数存储。大多数计算机本来就很小,但对于手动转换来说,这并不重要——只需选择一台即可。存储在4个字节中的65537(2^16+2),big endian,看起来像size_t
;little endian,{ 0, 1, 0, 2 }
。
一旦你决定了(不要紧,随便选哪一个),你只需把数据的前x个点投射到{ 2, 0, 1, 0 }
s,然后再投射到unsigned char
,然后用适当的指数做一点移动,把它们放在适当的位置,然后把它们加在一起。在上面的例子中,0乘以2^32,1乘以2^16,0乘以2^8,2乘以2^0(或1),得到0+65536+0+2或65537。如果你在做手动转换的话,大端和小端之间的效率差可能为零,我想再次指出,这个选择完全是任意的。
执行手动转换可以避免对齐问题,并完全绕过对跨系统端点的关注,因此从小端点计算机传输到大端点计算机的数据将被读取。数据从size_t
的系统传输到sizeof(size_t) == 4
的系统仍然存在潜在问题。如果这是一个问题,您可以a)丢弃sizeof(size_t) == 8
并选择一个不变大小,或者b)将发送方的size_t
值编码(只需要一个字节)作为数据的第一个字节,并让接收方进行任何必要的调整。选择a)可能更容易,但可能会导致问题(如果您选择的大小太低,无法考虑网络中的旧计算机,并且随着这些计算机的逐步淘汰,您开始没有空间存储您的数据?),所以我更喜欢选择b),因为它可以随您运行的任何系统(16位、32位、64位,甚至将来可能是128位)进行扩展,但您可能不需要这样做。sizeof(size_t)
我把它留给读者来整理我刚刚写的那些乱七八糟的东西。
关于c - 在C中正确分隔字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093250/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!