2012-02-16 3 views
0

iv работал над этим алгоритмом в C#, чтобы взять заданную строку, удалить любые пробелы, а затем вернуть результат. Да, есть миллион и один способ сделать это , но я хотел сделать свой собственный алгоритм независимым от стандартной библиотеки классов. Кроме того, я знаю, что есть миллион и один способ использовать подобный алгоритм по-другому, но, просто со мной, пожалуйста, пожалуйста.Как я могу исправить этот алгоритм управления строкой?

Алгоритм работает отлично, если первый символ в данной строке НЕ является пробелом. Но если в качестве первого символа есть пробел, возвращаемая строка содержит правильное количество символов, но символы являются «пустыми». По крайней мере, когда печатается на консоль. Я смотрел на этот код часами, пытаясь это, пытаясь, но, для жизни меня, я не могу понять, что вызывает проблему. Im испугался до смерти , чтобы даже опубликовать это, поскольку кто-то может придумать простое исправление, которое заставляет меня выглядеть отсталым , а затем iv татуировать все время, но, посмотрев и посмотрев, здесь. Мне нужна помощь! Возьмите gander в коде.

public static string RemoveSpaces(string arg) 
    { 
     char[] temp = arg.ToCharArray(); 
     int newLength = 0; 

     //Calculate number of characters that arent spaces. 
     for (int e = 0; e < temp.Length; e++) 
     { 
      if (temp[e] != ' ')//If not a space, 
      { 
       newLength++;//then increment number of characters. 
      } 
     } 

     //Now use that number as size in new array 
     char[] newString = new char[newLength]; 

     //Copy characters that arent spaces to the new char array. 
     for (uint e = 0, e2 = 0; e < temp.Length; e++, e2++) 
     { 
      //NOTE: e2 (and e) is a uint because it can end up negative for a 
      //short period. 
      if (temp[0] == ' ')//If the FIRST element is a space 
      { 
       e2--;//Then dont let e2 be "truely" incremented in next cycle. 
       continue; 
       //e (and e2) will now be incremented by the loop. 
       //but since we just decremented e2 it will be 1 behind e. 
       //So we wont be skipping an element in newString if 
       //we arent going to copy anything to that element. 
       //Same thing happens in the other if statement below. 
       //(Where the copying really happens) 
      } 

      if (temp[e] != ' ')//If element e is NOT a space, 
      { 
       newString[e2] = temp[e];//then copy that element to newString. 
      } 
      else//If element e IS a space 
      { 
       e2--;//Then dont let e2 be truely incremented in next cycle. 
       //Cycle is complete so no use for continue; here. 
      } 
     } 

     return new string(newString);//Done! 
    } 
+0

Чего вы хотите достичь? Вы хотите удалить лишние пробелы и внутри символов? –

+0

Возможный дубликат [Нет записей, возвращаемых, когда значение параметра пропускается из функции] (http://stackoverflow.com/questions/9113086/no-records-return-when-the-value-being-pass-in- параметр-is-from-function) –

ответ

1

Не увеличиваем e2 в каждой итерации, увеличивать его только тогда, когда символ не пробел.

Попробуйте это:

public static string RemoveSpaces(string arg) 
{ 
    int newLength = 0; 

    //Calculate number of characters that arent spaces. 
    foreach (char ch in arg) 
    { 
     if (ch != ' ')//If not a space, 
     { 
      newLength++;//then increment number of characters. 
     } 
    } 

    //Now use that number as size in new array 
    char[] newString = new char[newLength]; 

    //Copy characters that arent spaces to the new char array. 
    int pos = 0; 
    foreach (char ch in arg) 
    { 
     if (ch != ' ')//If element e is NOT a space, 
     { 
      newString[pos++] = ch;//then copy that element to newString. 
     } 
    } 

    return new string(newString);//Done! 
} 
+0

bea utifull. Работает как шарм. Благодаря! – kbzombie

1

e2 увеличивает только при написании символа.

0

Или просто сделать это:

static string RemoveSpaces(String s) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (char c in s) 
    { 
     if (c != ' ') 
     { 
      sb.Append(c); 
     } 
    } 
    return sb.ToString(); 
} 
+0

Спасибо за ответ, отличная информация. Должно быть полезно и другим людям. – kbzombie

+0

Надеюсь, вы не прочитали мой последний комментарий перед редактированием, это звучало грубо. Разве это не значит. – kbzombie

0

Я знаю, что вы не хотите, встроенный алгоритм, но str = str.Replace(" ", ""); легче всего запомнить для «реальной жизни». Кроме того, я хочу обратить ваше внимание на то, что пробелы - это не только ' '. Это все пробелы в C#: char [] spaces = { ' ', '\b', '\t', '\v', '\f', '\n', '\r' }; (последние два являются разрывами строк).

+0

Отличная информация, но я хочу только удалить пробелы, так как любой из этих других может быть интуитивно установлен программистом. Я всегда мог написать функцию, чтобы взять дополнительный параметр, который мог бы быть перечислением со всеми этими возможностями и переключиться на него, удалив только, ну, вы видите, где я иду с этим :) – kbzombie

0

Почему ты не используя

MyString.Replace(" ", ""); 

??????

+0

Потому что я хотел сам внедрить алгоритм, не используя ничего из стандартной библиотеки :) Почему вы не читаете весь пост ?????? – kbzombie

Смежные вопросы