C/C++ Int Array Parsing

Bu konuyu okuyanlar

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
Elimde şöyle bir metin var.

pSphere1.vtx[255]
pSphere1.vtx[275:280]
pSphere1.vtx[295]
pSphere1.vtx[297]
pSphere1.vtx[315]

Bu metin içindeki rakamları bulup array içerisine atamak istiyorum, eğer ki üst üste iki nokta varsa bunun sağındaki ve solundaki aralık üzerinde bulunan tüm örnekleri dahil etmek istiyorum.
Bu metin için sonuç şöyle bir int array olmalı.

255
275
276
277
278
279
280
295
297
315

Bunu C veya C++ en rahat ve performanslı nasıl yapabilirim ?
 

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
567
Puanları
93
Merhaba,

konuyu anlamak adına soracağım; pSphere1.vtx[255] bir dosyamı yoksa, bunu bir dosyadan mı okuyacaksınız ? Yoksa sadece elinizde char/string tiplerden birisi mi var ?

Saygılarımla
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
Merhaba,

konuyu anlamak adına soracağım; pSphere1.vtx[255] bir dosyamı yoksa, bunu bir dosyadan mı okuyacaksınız ? Yoksa sadece elinizde char/string tiplerden birisi mi var ?

Saygılarımla

Hayır dosyadan okumayacağım.
Bu veri bana başka bir fonksiyondan gelecek.
Veri tipi standart char *
 

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
567
Puanları
93
Merhaba,

kusura bakma geç dönüş yaptım ama geri çıkmam gerekiyor. Kısa zamanda yapmaya çalıştım, eksikleri olabilir mesela chr * tipine siz çevirirsiniz. Aslında ilk yazdığımı const char * ile yazmıştım sildim bunu yazdım. Üzerinde birkaç oynama ile hem c hem c++ da (vector için) çalıştırılabilir sanıyorum ki. Ya da kodlar daha da kısaltılabilirdi C++ lambda ile ama kafa karıştırmaya gerek yok.

#include <iostream>
#include <vector>
#include <string>
#include <cstring>

void GetNumberFromText()
{
vector<string> arr = { "pSphere1.vtx[255] pSphere1.vtx[275:280] pSphere1.vtx[295] pSphere1.vtx[297] pSphere1.vtx[315]" };
string str2 = "[";
vector<int> destArr(0, 100);
string str;

int counter = arr[0].find(str2) + 1;

for (size_t i = counter; i <= arr[0].size(); i++)
{
if (i == 0) break;

while (isdigit(arr[0]))
{
int x = 0;
str.push_back(arr[0]);
i++;
}
destArr.push_back(stoi(str));
str.clear();

if (arr[0] == ':')
{
++i;

while (isdigit(arr[0]))
{
int x = 0;
str.push_back(arr[0]);
i++;
}

for (size_t x = destArr[destArr.size() - 1]; x < stoi(str) - 1;)
{
x++;
destArr.push_back(x);
}

destArr.push_back(stoi(str));
str.clear();
}
i = arr[0].find(str2, i);
}

//konsola yazdırma
for (size_t i = 0; i <= destArr.size() - 1; i++)
{
cout << destArr << endl;
}
};

Saygılarımla

Edit : Tahmin etmişsinizdir; göz kırpma olan yerde noktalı virgül ve ardından parantez kapama var. Bir türlü beceremedim şu editörü kullanmayı..
 

Ben Kenobi

Müdavim
Katılım
6 Kasım 2011
Mesajlar
7,336
Reaksiyon puanı
3,155
Puanları
113
Merhaba,

kusura bakma geç dönüş yaptım ama geri çıkmam gerekiyor. Kısa zamanda yapmaya çalıştım, eksikleri olabilir mesela chr * tipine siz çevirirsiniz. Aslında ilk yazdığımı const char * ile yazmıştım sildim bunu yazdım. Üzerinde birkaç oynama ile hem c hem c++ da (vector için) çalıştırılabilir sanıyorum ki. Ya da kodlar daha da kısaltılabilirdi C++ lambda ile ama kafa karıştırmaya gerek yok.

#include <iostream>
#include <vector>
#include <string>
#include <cstring>

void GetNumberFromText()
{
vector<string> arr = { "pSphere1.vtx[255] pSphere1.vtx[275:280] pSphere1.vtx[295] pSphere1.vtx[297] pSphere1.vtx[315]" };
string str2 = "[";
vector<int> destArr(0, 100);
string str;

int counter = arr[0].find(str2) + 1;

for (size_t i = counter; i <= arr[0].size(); i++)
{
if (i == 0) break;

while (isdigit(arr[0]))
{
int x = 0;
str.push_back(arr[0]);
i++;
}
destArr.push_back(stoi(str));
str.clear();

if (arr[0] == ':')
{
++i;

while (isdigit(arr[0]))
{
int x = 0;
str.push_back(arr[0]);
i++;
}

for (size_t x = destArr[destArr.size() - 1]; x < stoi(str) - 1;)
{
x++;
destArr.push_back(x);
}

destArr.push_back(stoi(str));
str.clear();
}
i = arr[0].find(str2, i);
}

//konsola yazdırma
for (size_t i = 0; i <= destArr.size() - 1; i++)
{
cout << destArr << endl;
}
};

Saygılarımla

Edit : Tahmin etmişsinizdir; göz kırpma olan yerde noktalı virgül ve ardından parantez kapama var. Bir türlü beceremedim şu editörü kullanmayı..

Hocam teşekkür ederim, şu an için lazım değil ama ilerideki bir proje için lazım idi.
Bir ay sonra tekrar yazarsam şaşırma, tekrar teşekkürler, en azından parsinge adım atmış oldum.
Bu arada const tipi de olabilirdi, sorun olmazdı.
 

errno

Doçent
Katılım
17 Temmuz 2016
Mesajlar
694
Reaksiyon puanı
567
Puanları
93
Merhaba,

üstad elimden geldiği sürece her zaman yanında olurum. Yeterki bilgiyi paylaşalım.

Saygılarımla
 
Üst