string do wskaźnika char *

Odpowiedz Nowy wątek
2011-08-19 18:27
pyt.
0

#include<iostream>
#include<string>
using namespace std;

int main()
{
char *w;
string text;
getline(cin, text);

Czy w dalszej części kodu jest możliwość zapisu stringa do chara żeby móc przy pomocy wskaźnika odczytywać litery zapisane do zmiennej text?

Pozostało 580 znaków

2011-08-19 19:37
Rev
0

Czy ty chociaż próbowałeś użyć raz w życiu mózgu?
Podpowiem: przejrzeć dostępne metody tej klasy, użyć google, dokumentacji? C++ reference, msdn?


edytowany 1x, ostatnio: Rev, 2011-08-19 19:38

Pozostało 580 znaków

2011-08-19 19:48
aqwe
1

wiedz, że coś się dzieje !

Pozostało 580 znaków

2011-08-19 21:14
0
w = text.c_str();

ale ze stringa też można przez indeks czytać poszczególne litery.

Pozostało 580 znaków

2011-08-20 01:18
pyt.
0

Dzięki @Azarien, o to mi chodziło :) Mam jednak problem z optymalnością programu
KOD 1:

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
 
int main()
{
    char *cstr, *p;
    char arry[2] = {1,2};
    string text;
    while(getline(cin, text))
    {
       cstr = new char[text.size()+1];
       strcpy (cstr, text.c_str());
       p = cstr;
       while(*p!=0)
       {
             switch(*p)
             {
                   case 'X': printf("%c", 'A');
                    break;
                   case 'Y': printf("%c", 'B');
                    break;
                   case 'Z': printf("%c", 'C');
                    break;
                   case ' ': printf("%c", *p++);
                    break;
                   default: printf("%c", (char)(int)(*p++)+3);
        }
       }
       cout<<endl;
       }
       return 0;
}

KOD2:

#include<iostream>
#include<string>
using namespace std;
 
int main()
{
       string text;
       while(getline(cin, text)){
       for(short i = 0; i<text.length(); i++)
       {
        switch(text[i])
        {
        case 'X': printf("%c", 'A');
            break;
        case 'Y': printf("%c", 'B');
            break;
        case 'Z': printf("%c", 'C');
            break;
        case ' ': printf("%c", (char)(int)text[i]);
            break;
        default: printf("%c", (char)(int)text[i]+3);
        }
       }
        cout<<endl;
        }
    return 0;
}

Dlaczego KOD1 jest wolniejszy od KOD2, skoro KOD1 operuje na wskaźnikach?

Pozostało 580 znaków

2011-08-20 09:23
0

Jest wolniejszy, bo co iterację tworzysz kopię przeczytanego stringa, zupełnie bez sensu. Wystarczy do wskaźnika p przypisać to, co zwróci metoda string::c_str.

No i tak ogólnie, wskaźniki nie są gwarantem szybkiego kodu.

p.s. nigdzie nie zwalniasz pamięci, którą przydzielasz, a to błąd.

edytowany 1x, ostatnio: _0x666_, 2011-08-20 09:27

Pozostało 580 znaków

2011-08-20 09:26
0

a ktoś powiedział, że na wskaźnikach musi być szybciej? w pierwszej wersji kopiujesz całego stringa (strcpy) i pewnie na tym tracisz.

Pozostało 580 znaków

2011-08-20 10:23
pyt.
0
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
 
int main()
{
    const char *p;
    string text;
      while(getline(cin, text))
      {
          p = text.c_str();
          while(*p!=0)
          {
             switch(*p)
             {
                   case 'X': printf("%c", 'A');
                    break;
                   case 'Y': printf("%c", 'B');
                    break;
                   case 'Z': printf("%c", 'C');
                    break;
                   case ' ': printf("%c", *p++);
                    break;
                   default: printf("%c", (char)(int)(*p++)+3);
        }
          }
         cout<<endl;
   }
    return 0;
}

Pomimo poprawek program dalej nie jest optymalny. Czyżby funkcja c_str() spowalniała kod?

Pozostało 580 znaków

2011-08-20 11:02
0

Na pewno jest optymalniejszy niż był. Teoretycznie powinien być wydajniejszy niż wersja na indeksach.

Jak mierzysz czas i na jakich danych wejściowych? Zakładam, że pomiary robisz na wersji release, a nie debug.

Pozostało 580 znaków

2011-08-20 12:46
pyt.
0

Może od razu podam o jakie zadanie chodzi http://pl.spoj.pl/problems/JSZYCER/
W sumie kod na tablicach wykonuje mi się w około 0.01s natomiast ten na wskaźnikach ma przekroczony czas

Pozostało 580 znaków

2011-08-20 12:58
0

a ja się przyczepię tego switcha:

switch(*p)
{
case 'X': printf("%c", 'A');
break;
case 'Y': printf("%c", 'B');
break;
case 'Z': printf("%c", 'C');
break;
case ' ': printf("%c", *p++);
break;
default: printf("%c", (char)(int)(*p++)+3);
}

czytelniej by było:

char c;
switch(*p)
{
    case 'X': c = 'A'; break;
    case 'Y': c = 'B'; break;
    case 'Z': c = 'C'; break;
    case ' ': c = *p++; break;
    default : c = (char)(int)(*p++)+3;
}
printf("%c",c);
edytowany 3x, ostatnio: Azarien, 2011-08-20 12:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0