String[a][b] - czy prawidłowo ?

0
 int testow=0;
    cin >> testow;
    int * dlu=new int[testow+1];
    dlu[testow+1]=0;
    int * litery=new int[testow];
    litery[0]=0;
    int * cyfry=new int[testow];
    cyfry[0]=0;
    string * linia=new string[testow];
    for (int i=0; i<testow; ++i)
    {
        cin >> linia[i];
        dlu[i]=linia[i].length();
        dlu[i]=dlu[i]-1;
    }
    for (int k=0; k<dlu[k]; ++k)
    {
        for (int c=0; c<dlu[k]; ++c)
        {
            if (isdigit(linia[k][c]))  // tutaj jest błąd, niewolno tak używać el. tablicy ?
               ++cyfry[k];
            else 
               ++litery[k];
        }
    }
0

A umiesz zadać pytanie po polsku? Kod który podałeś jest poprawny składniowo i się kompiluje, więc odpowiedź brzmi: wolno tak odnosić się do pojedynczej litery ze stringa.

0

w takim razie błąd jest w innym miejscu, licząc krok po kroku, według mnie wszystko się zgadza, sprawdzałem pod względem "błędu o 1", odnoszenia się do nieistniejących elementów, większości mi znanych błędów które mogą powodować zawieszenie programu, używałem funkcji _sleep() - prototyp w windows.h - szukając miejsca które powoduje błąd, wszystko wskazywało na wcześniej wskazywaną linijkę dlatego wkleiłem tylko ten kawałek i cały przód z którym jest powiązana z myślą, że właśnie w stringu jest błąd, w takim razie przepraszam, zamieszczam cały kod. Osobiście nie mogę w nim dostrzec błędu.
Program wczytuje do wskazanej przez użytkownika liczby stringów wyrażenia/zdania a program ma zwrócić ile w danej linijce było 1.)wszystkich znaków 2.) literek 3.)cyferek

#include <cstdlib>
#include <iostream>
#include <cctype>
#include <windows.h>

using namespace std;

int main()
{
    int testow=0;
    cin >> testow;
    int * dlu=new int[testow+1];
    dlu[testow+1]=0;
    int * litery=new int[testow];
    litery[0]=0;
    int * cyfry=new int[testow];
    cyfry[0]=0;
    string * linia=new string[testow];
    for (int i=0; i<testow; ++i)
    {
        cin >> linia[i];
        dlu[i]=linia[i].length();
        dlu[i]=dlu[i]-1;
    }
    for (int k=0; k<dlu[k]; ++k)
    {
        for (int c=0; c<dlu[k]; ++c)
        {
            if (isdigit(linia[k][c]))  
               cyfry[k]=cyfry[k]+1;
            else 
               litery[k]=litery[k]+1;
        }
    }
    for (int e=0; e<testow; ++e)
    {
        cout << dlu[e] << " " << litery[e] << " " << cyfry[e];
    }
    system("PAUSE");
    return 0;
}
0

Ech. Linię wczytujemy przez getline() a nie operator>> Poza tym nie bardzo ogarniam co ty tam wyczyniasz i po co. Ja bym tego w ogóle nie tablicował ale jak bardzo chcesz to:

#include <iostream>
#include <cstdlib>
#include <cctype>
#include <cstdio>
using namespace std;

int main()
{
    int testow=0;
    cin >> testow;
    fflush(stdin); //bo mamy newline po cin>>
    int * litery=new int[testow];
    int * cyfry=new int[testow];
    string * linia=new string[testow];
    for (int i=0; i<testow; i++)
    {
        getline(cin,linia[i]);
    }
    for (int i=0; i<testow; i++)
    {
        cyfry[i]=0;
        litery[i]=0;
        for(unsigned int j=0; j<linia[i].length(); j++)
        {
            if (isdigit(linia[i][j]))
            {
                cyfry[i]++;
            }
            else if((linia[i][j]>='a' && linia[i][j]<='z') || (linia[i][j]>='A' && linia[i][j]<='Z'))
            {
                litery[i]++;
            }
        }
        cout << linia[i]<<" : "<< linia[i].length() << " " << litery[i] << " " << cyfry[i] << endl;
    }
    return 0;
}
0

Faktycznie, mój błąd. Jak byk w książce pisze: Jeżeli chcemy wczytać wiersz danych do obiektu string: getline(cin,str); Nie mamy tutaj kropki czyli ta wersja getline() nie jest metodą klasy. Cin to par. ... itd. co do samego zadania to dziwna sprawa, bo nie jes akceptowane przez program sprawdzający jego poprawność. Może wkleję treść zad. oryginalnego, być może źle je zinterpretowałem.
Wejście

Pierwsza linia wejścia zawiera liczbę naturalną n (1<=n<=10), mówiącą, ile linii tekstu znajduje się na znalezionej karteczce. Następnie podane są kolejno te linie. Każda z nich może zawierać małe i duże litery alfabetu angielskiego, cyfry, znaki interpunkcyjne oraz spacje. Długość każdej linii wynosi co najmniej 1 i co najwyżej 30 znaków.

Wyjście

Dla każdej linii tekstu wypisz oddzielone spacjami trzy liczby, oznaczające kolejno liczbę wszystkich znaków w tej linii, liczbę zawartych w niej liter oraz liczbę cyfr.

Przykład

Wejście:

2
Poczatek
23572,asd,329956!!!

Wyjście:

8 8 0
19 3 11

0

Udało się trzeba było zamienić fflush(stdin) na wywołanie funkcji get() bez parametru. Naprawdę bardzo dziękuje za pomoc i pozdrawiam.

0

Ale w takim razie kod jest lekko bez sensu. Po co tablicować wejście skoro można je wyliczać na bieżąco? Poza tym jeśli to zadanie na jakiegoś spoja to lepiej używać scanf/printf niż strumieni.

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