Questions tagged «strings»

“字符串”是通常代表人类可读文本单位的一系列字符。关于此主题的问题涉及程序中字符串的处理,以及各种语言和环境如何定义和操作字符串。

1
PHP如何在内部表示字符串?
UTF8? UTF16? PHP中的字符串是否也跟踪使用的编码? 让我们以这个脚本为例。说我跑步: $original = "शक्नोम्यत्तुम्"; 实际发生了什么? 显然,我认为$original不会只包含7个字符。这些字形必须在此处分别由几个字节表示。 然后我做: $converted = mb_convert_encoding ($original , "UTF-8"); 会发生什么$converted?有$converted什么不同$original? 它会与字节序列完全相同,$original但编码不同吗?
18 php  strings 

3
在Java中串联字符串时,在内存中创建了多少个字符串?
有人问我有关Java中的不可变字符串。我的任务是编写一个将多个“ a”连接到一个字符串的函数。 我写的是: public String foo(int n) { String s = ""; for (int i = 0; i < n; i++) { s = s + "a" } return s; } 然后我被问到这个程序将生成多少个字符串,假设不会发生垃圾回收。我对n = 3的想法是 ” “一种” “一种” “ aa” “一种” “啊!” “一种” 在循环的每次迭代中,基本上都会创建2个字符串。但是,答案是n 2。此函数将在内存中创建哪些字符串,为什么呢?
17 java  strings  object 

3
什么时候应该在接口中使用string_view?
我正在使用一个内部库,该库旨在模仿拟议的C ++库,并且在过去几年中的某个时候,我看到其接口已从使用更改std::string为string_view。 因此,我忠实地更改了代码,以适应新的界面。不幸的是,我必须传递的是std :: string参数,以及返回的std :: string值。所以我的代码从这样的事情改变了: void one_time_setup(const std::string & p1, int p2) { api_class api; api.setup (p1, special_number_to_string(p2)); } 至 void one_time_setup(const std::string & p1, int p2) { api_class api; const std::string p2_storage(special_number_to_string(p2)); api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size())); } 除了更多的代码(可能搞砸了)之外,我真的看不到这种变化给我作为API客户端带来了什么。API调用不太安全(由于API不再拥有其参数的存储空间),可能保存了我的程序0的工作(由于编译器现在可以进行移动优化),即使确实保存了工作,也只能在启动后或在某个地方的大循环中,将不会并且永远不会完成的一些分配。不适用于此API。 但是,这种方法似乎遵循我在其他地方看到的建议,例如,以下答案: 顺便说一句,从C ++ 17开始,您应该避免传递const std :: string&,而推荐使用std :: …

3
是否可以编写适用于所有本地化和字符串类型的通用字符串反向函数?
我只是在看Dev-Days的Jon Skeet(与Tony the Pony)一起演讲。 尽管“编写字符串反向函数”正在对采访101进行编码-我不确定实际上是否可以编写一种通用的字符串反向函数,但肯定不是在所有本地化和所有字符串类型中都有效的函数。 除了检测输入字符串是否为ascii,UTF8,UTF16(固定长度和可变长度)等之外 ,Jon还突出显示了“对下一个字符应用重音符号”(U + 0301)代码。然后有可能显示或不显示或连字编码为双字符的连字。 似乎“反向字符串”实际上是较难的计算机科学任务之一!

7
C库的函数是否应该总是期望字符串的长度?
我目前正在使用C语言编写的库。该库的许多功能都希望在其参数中包含char*或字符串const char*。我从那些函数开始就一直期望字符串的长度为a,size_t这样就不需要空终止。但是,在编写测试时,这导致频繁使用strlen(),例如: const char* string = "Ugh, strlen is tedious"; libFunction(string, strlen(string)); 信任用户传递正确终止的字符串将导致安全性降低,但更为简洁和(在我看来)可读的代码: libFunction("I hope there's a null-terminator there!"); 那么,这里的明智做法是什么?使API使用起来更加复杂,但会迫使用户考虑他们的输入,或者记录对以空值结尾的字符串的需求并信任调用者?
15 c  api  strings 

16
您将字符串反转用于什么用途?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 在PHP中是strrev(),在Rails中是.reverse,但是大多数语言没有任何字符串反向功能。有些具有可用于字符的数组反转功能。我以为这一定是一个重大的疏忽,但是后来发生在我身上,您实际将反向字符串用作什么? 我唯一能想到的是在演示和课程中启用“ Hello World!”。变成“!dlroW olleH”。 我的问题是;反转字符串有用途还是完全没有意义? 。 附录 我已经预料到会有更多答案,但并非所有答案都完全是学术性的。我本来会花钱的,没有人能提出一个合理的例子。我也认为我不会学到任何新东西,但Mark Canlas的正则表达式建议非常出色,我期待着有机会证明自己。谢谢大家。

1
为什么ASCII表中的标点符号到处都是?
在ASCII表中,标点符号出现在非打印字符之间以及数字(!"#$%&')*+,-./)之前,数字与大写字母(:;<=>?@)之间,大写字母([\]^_`)与小写字母之间以及小写字母({|}~)之后。 乍一看,人们希望将它们归为一类。可能在所有字母数字字符之前或之后。但这种情况并非如此; 他们喜欢散布在这些不同的群体中。 为什么会这样呢?是否有某些(可能是历史原因)将字符以这种方式分组的原因?
13 strings  ascii 

2
什么时候应该使用StringBuilder或StringBuffer?
在生产型Web应用程序中,我的同伴程序员在各处都使用StringBuffer。现在,我负责应用程序的开发和更正。阅读StringBuilder和StringBuffer之后,我决定将所有StringBuffer代码替换为StringBuilder,因为我们不需要数据bean中的线程安全。 例如:(在每个数据bean中,我都可以看到StringBuffer的使用) @Override public String toString() { StringBuffer sb = new StringBuffer();// replace it from StringBuilder sb.append(" ABCD : ").append(abcd); sb.append(", EFGH : ").append(efgh); sb.append(", IJKL : ").append(ijkl); } 我们为每个会话/请求创建一个单独的数据bean。会话由单个用户使用,其他用户无法访问它。 在迁移之前,我还应该考虑其他几点吗? 如果只有一个线程(没有等待线程/没有新线程将寻找对象锁定),则它与StringBuffer或StringBuilder的性能相同。我知道在使用StringBuffer的情况下,需要花费时间来获取对象锁,但是我想知道除了保持/释放对象锁外,它们之间是否存在任何性能差异。

3
我们可以从std :: string的c_str()获得什么性能?总是恒定的时间?
我最近一直在做一些必要的优化。我一直在做的一件事是更改一些ostringstreams-> sprintfs。我正在将一堆std :: strings冲刺到ac样式数组,ala char foo[500]; sprintf(foo, "%s+%s", str1.c_str(), str2.c_str()); 事实证明,Microsoft的std :: string :: c_str()实现在恒定时间内运行(它只返回一个内部指针)。看来libstdc ++也是一样。我意识到std不能保证c_str,但是很难想象另一种方式。例如,如果他们将其复制到内存中,要么不得不为缓冲区分配内存(将其留给调用方销毁,而不是STL合同的一部分),要么必须将其复制到内部静态对象中。缓冲区(可能不是线程安全的,并且您无法保证其寿命)。因此,仅返回指向内部维护的以null终止的字符串的指针似乎是唯一可行的解​​决方案。

8
C字符串是否始终以null终止,还是取决于平台?
现在,我正在使用嵌入式系统,并研究在没有操作系统的微处理器上实现字符串的方法。到目前为止,我正在做的只是使用使NULL终止的字符指针并将它们视为NULL表示结尾的字符串的想法。我知道这很普遍,但是您是否总是可以指望这种情况? 我问的原因是我正在考虑也许在某个时候使用实时操作系统,并且我想尽可能多地重用当前代码。因此,对于存在的各种选择,我是否可以期望字符串能够正常工作? 让我更具体地说明我的情况。我正在实现一个通过串行端口接收和处理命令的系统。我能否保持命令处理代码相同,然后期望在RTOS(包含命令)上创建的字符串对象全部以NULL终止?还是根据操作系统而有所不同? 更新资料 在被建议看一下这个问题之后,我确定它不能完全回答我的要求。问题本身是在询问是否应该始终传递字符串的长度,这与我要问的完全不同,尽管某些答案中包含有用的信息,但它们并不是我要找的。那里的答案似乎提供了为什么或为什么不以空字符终止字符串的原因。我要问的是,我是否可以或多或少地期望不同平台的出生字符串以空值终止自己的字符串,而不必走出去尝试在那里的每个平台。

4
具有无意义默认值的结构
在我的系统经常与机场代码(操作"YYZ","LAX","SFO"等),他们总是在完全一样的格式(3封信,表示为大写)。系统通常每个API请求处理这些代码中的25-50个(不同),总共分配了上千个代码,它们在我们应用程序的许多层中传递,并且经常比较它们的相等性。 我们从传递字符串开始就可以了,但仍然可以正常工作,但很快就发现了很多编程错误,因为在期望3位代码的地方传递了错误的代码。我们还遇到了一些问题,我们应该进行不区分大小写的比较,而没有这样做,从而导致错误。 由此,我决定停止传递字符串并创建一个Airport类,该类具有一个采用并验证机场代码的构造函数。 public sealed class Airport { public Airport(string code) { if (code == null) { throw new ArgumentNullException(nameof(code)); } if (code.Length != 3 || !char.IsLetter(code[0]) || !char.IsLetter(code[1]) || !char.IsLetter(code[2])) { throw new ArgumentException( "Must be a 3 letter airport code.", nameof(code)); } Code = code.ToUpperInvariant(); } public string …


5
如何将ASCII字符串压缩为更少的字节?
我正在使用具有唯一协议的嵌入式设备,该协议会将消息发送到其他设备,并且正在开发一个应用程序来解析发送的数据包。每个数据包携带8个字节。协议定义为第一个字节为标头,其余7个字节为数据。 他们正在尝试传递特定的ID字符串,但ID字符串的长度为8个字符(ASCII),因此它不能容纳7个字节。 我的同事告诉我的是,他们将把原始字符串的8个ascii字节转换为整数(十进制),并向我发送4个字节。他们告诉我,我应该能够从4个字节中获取原始字符串。在这方面,我很难缠头。 因此,如果您有一个像“ IO123456”这样的ID字符串,那么它就是ASCII中的0x49 0x4f 0x31 0x32 0x33 0x34 0x35 0x36 ?我错过了什么吗?还是我的同事误会了?我知道这是一个非常棘手的问题,但对我而言,这没有任何意义。
12 strings  ascii  byte 

1
最短公共超级字符串:查找包含所有给定字符串片段的最短字符串
给定一些字符串片段,我想找到包含所有片段的最短的单个字符串(“输出字符串”)。片段在输出字符串中可以相互重叠。 例: 对于字符串片段: BCDA AGF ABC 以下输出字符串包含所有片段,并且是通过天真的附加而制成的: BCDAAGFABC 但是,此输出字符串更好(更短),因为它使用了重叠: ABCDAGF ^ ABC ^ BCDA ^ AGF 我正在寻找解决此问题的算法。找到严格最短的输出字符串并不是绝对重要,但是越短越好。我在寻找一种比明显的幼稚算法更好的算法,该算法会尝试附加输入片段的所有排列并消除重叠(看起来是NP-Complete)。 我已经开始研究解决方案,事实证明这很有趣。我想看看其他人会提出什么。我会在一段时间内将正在进行的工作添加到该问题中。

6
一次连接一个字符串效率低下吗?
我回想起用C语言进行编程的日子,当两个字符串连接在一起时,操作系统必须为连接的字符串分配内存,然后程序可以将所有字符串文本复制到内存中的新区域,然后旧内存必须手动进行被发布。因此,如果像加入列表一样多次执行此操作,则OS必须不断分配越来越多的内存,只是要在下一个串联后释放它。用C语言执行此操作的更好方法是确定组合字符串的总大小,并为整个连接的字符串列表分配必要的内存。 现在,在现代编程语言(例如C#)中,我通常会看到遍历集合的内容,方法是遍历集合并将所有字符串一次全部添加到单个字符串引用中。即使具有现代计算能力,这也不低效吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.