Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > [VC#] Извлечение 9 элемента строки.


Автор: MuForum 14.10.2007, 17:40
Доброе время суток!

Задача: Есть строка вида:
Код

"43 3 30 10 10 240 240 -1 3"
эта строка также может выглядеть вот так:
"43 3 30 10 10 240 240 -1 3//comment"
"43 3 30 10 10 240 240 -1 3 //comment"
"  43   3  30  10  10 240 240  -1   3//comment"


- Необходимо извлекать 9 элемент строки, то есть в данном случае это "3".

- Я как не мучался, у меня пока не выходит. Думал сделать вот таким образом, но тоже не выходит:
Код

                    for (int i1 = (i + 1); i1 < richTextBox2.Lines.Length; i1++)
                    {
                        String T1 = richTextBox2.Lines[i1];
                        if (T1 != "end" && T1.Length > 0)
                        {
                            String TL = "";
                            int j = 0;
                            for(int il=1; il <= T1.Length; il++)
                            {
                                if (T1[il] != ' ')
                                {
                                    TL = TL + T1[il];
                                }
                                else if (T1[il] != ' ' && j==8)
                                {

                                }
                                else
                                {
                                    j++;
                                    TL="";
                                } 
                            }
                        }
                    }


- Этот метод глупый, да и не работает, так как если в начале несколько пробелов, то переменная "j" увеличивается, следовательно будет не верное решение =(

P.S. -> По идеи, строку надо разделять как-то, я так делал в C++ во время работы с IP-адресами, но у меня не получается это реализовать на VC# =(




#Добавлено:
-------------------

Вот так была реализована у меня проверка правильности IP-адреса на C++. (Благодарю за помощь dumb)

Код

 TStringList *sl = new TStringList();
 TStringList *ip = new TStringList();
 ip->Sorted = true;
 sl->Sorted = true;
 sl->Duplicates = dupIgnore;
 sl->LoadFromFile(FileDir+"Data\\"+FilterFileName);
 for (int i = 0; i < sl->Count; ++i)
 {
  int ip1, ip2, ip3, ip4;
  AnsiString s = sl->Strings[i].Trim();
  if(s.Pos(" ")) continue;
  if(sscanf(s.c_str(), "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4)==4)
  {
   // проверка правильности ip-адреса.
   if(ip1 > 0 && ip1 < 224 && ip2 > -1 && ip2 < 256&& ip3 > -1 && ip3 < 256 && ip4 > -1 && ip4 < 256)
   {
    s.printf("%d.%d.%d.%d", ip1, ip2, ip3, ip4);
    ip->Add(s);
   }
  }
 }
 ListBox1->Clear();
 ListBox1->Items->AddStrings(ip);
 delete ip;
 delete sl;

Автор: mihryak 14.10.2007, 19:03
http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpref/html/frlrfsystemstringclasssplittopic.asp поможет

Автор: MuForum 14.10.2007, 21:03
#2, mihryak - Благодарю за помощь, у меня пока в консоли вышло вот такое:

Код

using System;
using System.Collections.Generic;
using System.Text;

namespace Split
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] K = new string[50];
            int j = 0;
            string delimStr = " /";
            char[] delimiter = delimStr.ToCharArray();
            string words = " 26   3  30 128   0 251 128  -1  25 // Dragon";
            string[] split = null;

            Console.WriteLine("The delimiters are '{0}'", delimStr);
            int x = words.Length;
            split = words.Split(delimiter, x);
            Console.WriteLine("\ncount = {0} ..............", x);
            foreach (string s in split)
            {
                if (s.Length > 0)
                {
                    K[j] = s;
                    Console.WriteLine("'{0}'", K[j]);
                    j++;
                }
            }
            Console.WriteLine("K[8] = '{0}'", K[8]);
            Console.ReadKey();
        }
    }
}

Автор: MuForum 14.10.2007, 22:04
#2, mihryak - Сделал, но почему-то работает не всегда, почему, понять не могу =(

P.S. -> При обработке ниже изложенного текста выдаёт только 10:
Код

1
26    3    30    128    0    251    128    -1    10 // Goblin => Noria
27    3    30    128    0    251    128    -1    10 // Chain Scorpion => Noria
28    3    30    0    0    128    128    -1    10 // Beetle Monster => Noria
29    3    30    0    0    128    128    -1    10 // Hunter => Noria
26  3    5 143 110 156 119  -1  10 // Spider noria
30    3    30    0    128    251    245    -1    10 // Forest Monster => Noria
31    3    30    0    128    251    245    -1    15 // Agon => Noria
32    3    30    128    128    251    245    -1    15 // Stone Golem => Noria
33    3    30    0    128    128    245    -1    15 // Elite Goblin => Noria
end



Вот код самих действий:
Код

                else if (T == "1")
                {
                    for (int i1 = (i + 1); i1 < richTextBox2.Lines.Length; i1++)
                    {
                        String T1 = richTextBox2.Lines[i1];
                        if (T1 != "end" && T1.Length > 0)
                        {
                            string[] K = new string[250];
                            int j = 0;
                            string delimStr = " /=<>+:;'.!@#$%^&*()";
                            char[] delimiter = delimStr.ToCharArray();
                            string words = T1;
                            string[] split = null;
                            int x = words.Length;
                            split = words.Split(delimiter, x);
                            foreach (string s in split)
                            {
                                if (s.Length > 0)
                                {
                                    K[j] = s;
                                    richTextBox1.AppendText(string.Format("K[{0}] = | s = {1}", Convert.ToInt32(j), s) + Environment.NewLine);
                                    j++;
                                }
                            }
                            k1 = k1 + Convert.ToInt32(K[8]);
                            richTextBox1.AppendText(string.Format("K[8] = {0}", K[8]) + Environment.NewLine);
                        }
                        else if (T1 == "end") break;
                    }
                }



А вот лог программы:
Код

Initialization program is in a progress...
Initialization program is completed.
Checking count units is in progress. Please wait..
K[0] = | s = 26    3    30    128    0    251    128    -1    10
K[1] = | s = Goblin
K[2] = | s = Noria
K[8] = 
K[0] = | s = 27    3    30    128    0    251    128    -1    10
K[1] = | s = Chain
K[2] = | s = Scorpion
K[3] = | s = Noria
K[8] = 
K[0] = | s = 28    3    30    0    0    128    128    -1    10
K[1] = | s = Beetle
K[2] = | s = Monster
K[3] = | s = Noria
K[8] = 
K[0] = | s = 29    3    30    0    0    128    128    -1    10
K[1] = | s = Hunter
K[2] = | s = Noria
K[8] = 
K[0] = | s = 26
K[1] = | s = 3
K[2] = | s = 5
K[3] = | s = 143
K[4] = | s = 110
K[5] = | s = 156
K[6] = | s = 119
K[7] = | s = -1
K[8] = | s = 10
K[9] = | s = Spider
K[10] = | s = noria
K[8] = 10
K[0] = | s = 30    3    30    0    128    251    245    -1    10
K[1] = | s = Forest
K[2] = | s = Monster
K[3] = | s = Noria
K[8] = 
K[0] = | s = 31    3    30    0    128    251    245    -1    15
K[1] = | s = Agon
K[2] = | s = Noria
K[8] = 
K[0] = | s = 32    3    30    128    128    251    245    -1    15
K[1] = | s = Stone
K[2] = | s = Golem
K[3] = | s = Noria
K[8] = 
K[0] = | s = 33    3    30    0    128    128    245    -1    15
K[1] = | s = Elite
K[2] = | s = Goblin
K[3] = | s = Noria
K[8] = 
Amount 0 units : 46
Amount 1 units : 10
Amount 2 units : 97
Amount 3 units : 0
Amount 4 units : 693
Total units : 846



# Добавлено: Проблему нашел, она заключается в том, что если делать разделения через пробелы, всё считается нормально, а если делать через специальную программу, то пробелов тоже визуально 3, но это считается один символ!

Вопрос: Как отслеживать этот символ, которые разделяет элементы между собой?

Автор: archeg 14.10.2007, 22:23
Цитата(MuForum @  14.10.2007,  22:04 Найти цитируемый пост)
Вопрос: Как отслеживать этот символ, которые разделяет элементы между собой?

Код

"\t"

Автор: MuForum 14.10.2007, 22:33
#5, archeg - Благодарю за помощь, задача решена!


P.S. -> Всем кто принимал участие в решение выше изложенной проблеме благодарность!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)