这是原始问题Link的链接。现在我能够解决这个问题。但我想在C#中解决同样的问题。我已经用一种方式解决了它。但是当我像原始链接问题那样实现它时,我遇到了同样的问题。
以下是我的一个实现的代码,它解决了C#中的问题,
using System;
namespace CSharpStrings
{
class MyStringManipulators
{
private string input;
private string[] subStrs;
public void GetInputString()
{
Console.WriteLine("Enter string:");
input = Console.ReadLine();
Console.WriteLine(ReverseString(input));
}
public string ReverseString(string input)
{
char[] tempStr = new char[input.Length];
int tempIndex = 0;
for(int i=input.Length-1;i>=0;i--)
{
tempStr[tempIndex] = input[i];
tempIndex++;
}
String newStr = new String(tempStr);
//Console.WriteLine(newStr);
return newStr;
}
public string ReverseWordsInStr()
{
String newStr="";
subStrs = input.Split(' ');
for(int i=0;i<subStrs.Length;i++)
{
subStrs[i] = ReverseString(subStrs[i]);
newStr = newStr + subStrs[i] + " ";
}
//Console.WriteLine(newStr);
return newStr;
}
}
class Program
{
static void Main(string[] args)
{
MyStringManipulators obj = new MyStringManipulators();
obj.GetInputString();
Console.WriteLine(obj.ReverseWordsInStr());
}
}
}
这是另一个版本。这个版本的实现实际上类似于链接实现中的版本。但是,这个版本与原始链接中的问题相同。但是,这个问题的解决方案在这里不起作用。因为我认为C#字符串不是空终止的。
using System;
namespace CSharpStringV2
{
class MyStringMan
{
private string input;
public void GetInput()
{
Console.WriteLine("Enter String:");
input = Console.ReadLine();
}
public void ReverseWords()
{
int wordEnd = 0, indexS = 0, indexE = 0;
char[] newStr=new char[input.Length];
while (wordEnd < input.Length)
{
if (wordEnd<input.Length && input[wordEnd] != ' ')
{
wordEnd++;
}
else
{
if (input[wordEnd] == ' ' || wordEnd == input.Length)
{
indexE = wordEnd - 1;
while (indexS < wordEnd)
{
newStr[indexS] = input[indexE];
indexS++;
indexE--;
}
newStr[indexS] = ' ';
indexS++;
}
wordEnd++;
}
}
string nStr = new string(newStr);
Console.WriteLine(nStr);
}
}
class Program
{
static void Main(string[] args)
{
MyStringMan obj = new MyStringMan();
obj.GetInput();
obj.ReverseWords();
}
}
}
我的问题是如何让第二次实施工作?我猜它有一个问题,因为C#字符串不以\0
终止符结束。所以我如何使第二个实现工作,如果可能的话?
答案 0 :(得分:1)
你错过了最后一个字,因为wordEnd == input.Length
因为在此之前已经退出while (wordEnd < input.Length)
循环而永远不会变为真。
您需要将其更改为while (wordEnd <= input.Length)
,就像您链接的答案一样。
编辑: 您还需要将其他部分更改为:
if (wordEnd == input.Length || input[wordEnd] == ' ')
{
indexE = wordEnd - 1;
while (indexS < wordEnd)
{
newStr[indexS] = input[indexE];
indexS++;
indexE--;
}
if (wordEnd < input.Length)
{
newStr[indexS] = ' ';
indexS++;
}
}
答案 1 :(得分:1)
我修改了您的ReverseWords方法以解决问题。
请参阅代码中的注释
public void ReverseWords()
{
int wordEnd = 0, indexS = 0, indexE = 0;
char[] newStr = new char[input.Length];
while (wordEnd <= input.Length) //Needed to use <=
{
if (wordEnd < input.Length && input[wordEnd] != ' ')
{
wordEnd++;
}
else
{
//Reversed the conditional checks as the second check
//is an overflow with the last word
if (wordEnd == input.Length || input[wordEnd] == ' ')
{
indexE = wordEnd - 1;
while (indexS < wordEnd)
{
newStr[indexS] = input[indexE];
indexS++;
indexE--;
}
//Added condition to not add a space after the last word
if(wordEnd != input.Length)
newStr[indexS] = ' ';
indexS++;
}
wordEnd++;
}
}
string nStr = new string(newStr);
Console.WriteLine(nStr);
}