在 C# 中使用 string.Remove('\n') 会在某一点截断字符串

Posted

技术标签:

【中文标题】在 C# 中使用 string.Remove(\'\\n\') 会在某一点截断字符串【英文标题】:Using string.Remove('\n') in C# truncates the string at one point在 C# 中使用 string.Remove('\n') 会在某一点截断字符串 【发布时间】:2021-07-14 10:09:27 【问题描述】:

我有一个带换行符的 IP 地址字符串。 我需要从文字中删除所有换行符。所以我使用了 string.Remove()

现在一旦调试器越过这条线,表达式的结果会在“192.168.20”处截断

为什么会这样。我不想用替换,我想去掉'\n'

【问题讨论】:

string.Remove 方法需要一个字符来删除。我希望它被转换为 int (10) 即使它尝试转换为 int,它如何在特定点截断?我能够使用 var result = @"192.168.204.18".Replace("\n", ""); 解决它但我想知道为什么 string.Remove() 表现不佳 这并不奇怪。为什么你觉得它表现得很奇怪? 【参考方案1】:

如果您查看documentation,您会发现实际上没有需要删除字符的string.Remove 重载。

我希望 char 被隐式转换为 int 并且您正在点击 string.Remove(startIndex)

返回一个新字符串,其中当前实例中的所有字符(从指定位置开始到最后一个位置)都已被删除。

\n 将转换为字符的十进制值 10,因此作为位置 10 传递给 string.Remove,因此之后的所有内容都会被删除,这就是我们所看到的情况:192.168.20 有 10 个字符长。

如果您只想删除第一个 \n 之后的所有内容(包括第一个 \n),我建议您这样做:

int idx = input.IndexOf("\n", StringComparison.InvariantCulture);
if (idx != -1)

    input = input.Remove(idx);

或者简单地替换所有\n 的实例,使用replace(我知道你说过你不想这样做,但以防万一):

input = input.Replace("\n", string.Empty, StringComparison.InvariantCulture);

【讨论】:

很好的解释。谢谢。!【参考方案2】:

String.Remove 不接受字符而是索引。

整数形式的\n10,这样可以解释你的行为。

你正在寻找的是这样的:

result = input.Replace("\n", "");

【讨论】:

"我不想用 Replace,我想去掉 '\n'". 我在问题和评论中明确提到我知道如何使用 string.Replace()。 这正是 Replace 所做的。它将 \n 替换为空,从而将其删除 我只是想知道为什么它会截断IP地址中'20'处的字符串 因为 Remove 需要一个 Int32as 参数,所以你给它一个 char 隐式转换为 Int32 : 10。所以它会在索引 10 处截断你的字符串。如果你看结果,您会发现192.168.20 正好是 10 个字符长。

以上是关于在 C# 中使用 string.Remove('\n') 会在某一点截断字符串的主要内容,如果未能解决你的问题,请参考以下文章

C# string

如何在 constexpr string_view 上使用 std::string_view::remove_prefix()

从单词中删除一个字母[重复]

在 Android 中重新启动时保存更改字符串

在 C++ 中使用 C# 接口或在 C# 中使用 C++ 接口

如何在 C# 的泛型中使用扩展