Wczytanie tablicy char i wydrukowanie jej rozmiaru

0

Witam, mam taki problem. Chcę wczytać tablicę char i wydrukować jej rozmiar.

#include <iostream>
using namespace std;
void isPalindrom(char s[])
{
	cout << sizeof(s);
}
int main()
{
	int a=0;
	cin >> a;
	char s[a];
	for(int i=0; i<a;i++)
		cin >> s[i];
	isPalindrom(s);
	return 0;
}

Wypisuje mi wartość za każdym razem 8, dlaczego?

0

sizeof o ile się nie mylę działa w czasie kompilacji.

0

To czego mam użyć jeśli potrzebuję rozmiaru tablicy?

0

W tym wypadku możesz iterować po tablicy aż do wystąpienia znaku '\n'

0

To w takim razie po co jest sizeof? Nie ma czegoś takiego jak przy stringach strlen?

0

nie, a poza tym nie zauważyłem ale ten kod nie powinien w ogóle działać gdyż tablica nie może być deklarowana w taki sposób, jej rozmiar musi być znany w czasie kompilacji.

1

To co napisałeś to straszna bzdura.

int a=0;
cin >> a;
char s[a];

Nie można tak robić w C++. To jest VLA z C, która jako rozszerzenie działa w niektórych kompilatorach w C++ (VLA będzie w C++14).

sizeof podaje rozmiar typu w bajtach. Ponieważ typy znane są podczas kompilacji, wartość ta jest podstawiana w czasie kompilacji i koniec. Podczas przekazywania do funkcji tablice są konwertowane do wskaźnika na pierwszy element, także s ma typ char * - u Ciebie widocznie 8 bajtów. Rozmiar tablicy należy przekazać do funkcji.

Zapomnij i tablicach char w C++ - do tego jest std::string. Jeżeli jesteś masochistą i chcesz używać do obsługi napisów tablic char masz trzy wyjścia:

  • użyć statycznego bufora.
  • użyć dynamicznego bufora.
  • napisać własną klasę do obsługi napisów (strasznie głupie - po to jest std::string).
0

Mam w zadaniu użycie char, nie mogę string. Nie wiem co to jest statyczny i dynamiczny bufor, zrobię liczenie do "\n"

0

while(s[i]!='/n')

Czy dobrze działa to dopóki nie znajdzie koniec tablicy?

0

Znaczy, żeby sprawdzić jaka jest długość tablicy mam:

int i=0;
while(s[i]!='/n')
	i++;
0

for(i=0;s[i]!='\n';i++) dlugosc++; tak można w jednej linijce :)

0
#include <iostream>
using namespace std;
int isPalindrom(char s[])
{
	int dlugosc=0;
	for(int i=0;s[i]!='\n';i++) 
		dlugosc++;
	for(int j=0;j<(dlugosc-1)/2;j++)
		if(s[j]!=s[dlugosc-j])
			return 0; 
	return 1;
}
int main()
{
	int a=0;
	cin >> a;
	char s[a];
	for(int i=0; i<a;i++)
		cin >> s[i];
	cout << isPalindrom(s);
	return 0;
}

To dlaczego mi nie działa palindrom?

0

Nie działa mi, jak wpisuje np. ala to dostaje 0, i za kazdym razem jak chce wypisac dlugosc tablicy to otrzymuje 14130

0

ale ten kod nie działa:

for(int i=0; i> s[i];

daj ten kod który działa u ciebie

dodanie znaczników <code class="cpp"> - fp

0

Nie działa for który liczy długość, o to mi chodzi, dlaczego on nie działa tylko wylicza 14130?

0

Zaraz napiszę ci gotowy kod

0

To powinno działać:

#include <iostream>
using namespace std;
int isPalindrom(char s[], size_t l)
{
        int i=0;
        l--;
        while(i<=l)
        {
            if(s[i]!=s[l]) return 0;
            i++;
            l--;
        }
        return 1;
}
int main()
{
        char s[1000];
        size_t length;
        cin>>length>>s;
        cout << isPalindrom(s, length);
        return 0;
} 
0

Tylko że własciwie w zadaniu mam zrobic sama funckje isPalindrom bez main i ma byc w niej jeden argument czyli tablica char i sam musze sprawdzic jej rozmiar, dlatego ponawaim pytanie jak sprawdzic dlugosc tablicy char

0
Nominalista napisał(a):

Tylko że własciwie w zadaniu mam zrobic sama funckje isPalindrom bez main i ma byc w niej jeden argument czyli tablica char i sam musze sprawdzic jej rozmiar, dlatego ponawaim pytanie jak sprawdzic dlugosc tablicy char

std::strlen z <cstring>

http://en.cppreference.com/w/cpp/string/byte/strlen

Nie zwracaj int, tylko bool. No i przemyśl dokładnie ten algorytm sprawdzania czy wyraz jest palindromem - wcale nie musisz iterować po całym słowie.

2

Jeśli teraz pasuje zaakceptuj post:

 #include <iostream>
using namespace std;
int isPalindrom(char s[])
{
        int l=0;
        for(int i=0;s[i]!=NULL;i++) l++;
        int i=0;
        l--;
        while(i<=l)
        {
            if(s[i]!=s[l]) return 0;
            i++;
            l--;
        }
        return 1;
}
int main()
{
        char s[1000];
        cin>>s;
        cout <<isPalindrom(s);
        return 0;
}
0
bool isPalindrom(char *p) { char *k=strchr(p,0); while((p<--k)&&(*p==*k)) ++p; return p>=k; }
0

A jak wczytuję zdanie to w tym wypadku NULL tzn. ze bedzie wczytywac az pojawi się spacja?

0

w przypadku mojego kodu tak

0

Czyli powinienem jak chce teraz wpisac zdanie uzyc zamiast null -> '\n'?

0

Nie w tym rzecz, problem w tym że jak wczytujesz z obiektu cin(cin>>s) to pobiera on dane z klawiatury do białego znaku, możesz to wczytać przy pomocy metody cin.getline()

0

I wtedy to z \n zadziala?

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