奇怪的字符串行为,取代了自身的一部分

时间:2013-05-08 10:40:29

标签: c# string

我似乎无法绕过这个。怎么会变成:

string.Format(@"https://www.dropbox.com/s/{0}/{1}?dl=1", dl[rndIndex], rndIndex);

这样:

  

/3?dl=1/www.dropbox.com/s/s8ghw2mvld2jg0l

就像在{0}之后接受部分,将其移到前面并覆盖现有的字符串...... 有谁知道这里发生了什么?

这是整个代码(伪):

string[] dl = new string[] { "...", "...", "..." };
int rndIndex = rnd.Next(0, dl.Length);
Console.WriteLine(string.Format(@"https://www.dropbox.com/s/{0}/{1}?dl=1", dl[rndIndex], rndIndex));

dl []和rndIndex没有任何问题,检查了它们。

这解决了问题:

            string s = dl[rndIndex];
            s = s.Replace(((char)13).ToString(), "");

你的建议是什么。

3 个答案:

答案 0 :(得分:7)

它替换URL开头的方式,似乎dl[rndIndex]包含一个回车符,它将光标放回行的开头,然后覆盖URL的https:/部分(适合/3?dl=1的长度相同)。

所以你的格式化字符串实际上是这样的:

"https://www.dropbox.com/s/s8ghw2mvld2jg0l\r/3?dl=1"
                                          ^^
                                    carriage return

现在,当打印到支持回车的控制台时,它将打印第一部分https://www.dropbox.com/s/s8ghw2mvld2jg0l,然后将光标设置回到开头并打印其余部分/3?dl=1

所以你应该首先从字符串中删除所有回车符。无论如何,好像你的dl数组不包含你期望的那样。

答案 1 :(得分:0)

我可以通过@ poke的评论重现确切的问题:

string.Format("https://www.dropbox.com/s/{0}/{1}?dl=1", "hfjdhfjdh\r", 30)

将输出:

/30?dl=1www.dropbox.com/s/hfjdhfjdh

问题是数组元素中的回车符或换行符。

答案 2 :(得分:0)

按如下方式修改您的片段:

string[] dl = new string[] { "...", "...", "..." };
int rndIndex = 1;    // rnd.Next(0, dl.Length);
Console.WriteLine(string.Format(@"https://www.dropbox.com/s/{0}/{1}?dl=1", dl[rndIndex], rndIndex));

给出正确的答案。

https://www.dropbox.com/s/.../1?dl=1

所以,两个想法:

  • 这是一个数据相关的问题
  • 随机函数是否应该读取rnd.Next(0, dl.Length-1)