Pobieranie i sprawdzanie liczb - jak sprawdzić bufor?

0

Witam!

Mam pewien problem związany z buforem. Mam zadanie, aby po wpisaniu liczby i napisu, sprawdzić czy liczba jest mniejsza od liczby liter w napisie, a jeśli jest mniejsza to muszę wstawić \0, aby skrócić napis. No i właśnie nie wiem jak do tego bufora podejść, właściwie nie wiem jakich instrukcji użyć. Próbówałem z getcharem (kontrola poprawności danych na nim się opiera, więc myślałem, że tutaj zadziała

string napis;
	int liczba;
		cin>>liczba;
		cin>>napis;

	for (int i=0; i<liczba; i++)
	{
		if (napis=getchar()=='\0')
			cout<<"zero"<<endl;
	}

program miał być tymczasowo, tak żeby debuger mi pomógł, ale program prosi o wprowadzenie kolejnych znaków.

1

W sumie, jedyne co Ty tu robisz, to kilka razy sprawdzasz czy w stringu napis nie ma NULLa.
Z tego co wyczytałem, chcesz zrobić coś takiego, tak?
\0 to nie jest 0, tylko koniec stringa, i funkcją getline() go nie wczytasz.

#include <iostream>
using namespace std;
int main() {
std::string napis;
int liczba;
std::cin >> liczba;
std::cin >> napis;
if(liczba < napis.size()) napis+="\0";
}
0

Właściwie to nie rozumiem Twojego zapisu trochę (zedytowałeś ;P nie ważne teraz. :D). Ale Chodzi o to, że liczba którą poda użytkownik ma być większa od liczby liter w słowie. Jeżeli poda mniejszą liczbę od liczby liter, wtedy skraca słowo o tyle liter o ile podał liczb, przykład:

użytkownik podaje 4, potem "dom". To jest wszystko dobrze, bo liczba jest większa od liczby liter.
użytkownik podaje 2, potem "dom". To jest źle, więc skraca wyraz "dom" do 2 litery- wynik ma być "do".

PS. Nie wiem jak u Ciebie, ale u mnie wyrzuca tyle błędów, że nie sposób tego zliczyć. ;P

2
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() 
{
        string x;
        size_t y;
        cin >> x;
        cin >> y;
        if(y<x.length())
        {
	    x.erase(x.begin()+(x.length()-y),x.end());
	   cout << x;
        }
        return 0;
// kurde, w edytorze na forum pisane i sie rozjechało :P
}

https://ideone.com/YRC5Vf

0

A nie dałoby się tego trochę prostszym językiem napisać? Nie używając biblioteki algorithm? Bo właściwie potem mam to wrzucić do funkcji która zwraca, jak nie mniemam, wartość struktury zaimplementowanej wcześniej i ciężko by było wprowadzić kod, którego nie rozumiem :/

1

@Sachato Co tu do rozumienia?
http://www.cplusplus.com/reference/string/string/erase/
http://www.cplusplus.com/reference/iterator/begin/
http://www.cplusplus.com/reference/iterator/end/
x.erase(x.begin()+(x.length()-y),x.end());
"januszex", to składa sie z 8 znaków.
więc każesz funkcji erase(), wymazać znaki od x.begin() = 8-3 = 5
+====================================+
| J | A | N | U | S | Z | E | K | S |
+==0===1===2===3===4===5===6===7===8===+
//po 13 edicie wyszło :D
x.begin()+(x.length()-y) wskazuje na kratke 5, natomiast x.end() na 8.
W wyniku wycina <5,8>
Mam nadzieje że Ci to zobrazowałem :)

0

Ogólnie funkcja nie robi to co chciałem, ale rozumiem o co Chodzi, zobrazowałeś mi to dość ładnie i czytelnie : )

Problem w tym, że mój program jest odgórnie skazany na użycie '\0' (oznaczającego koniec w stringach) i mam narzucony z góry algorytm- mam stworzyć strukturę danych zawierającą napis i liczbę, następnie w kodzie źródłowym mam za pomocą tej struktury stworzyć tablicę, a następnie powpisywać do odpowiednich miejsc odpowiednie dane (tzn. liczbę i słowo dla elementu tablicy).
Później za pomocą funkcji mam właśnie przeprowadzić tą akcję, że bierze tą moją tablicę jednowymiarową o typie struktury (liczba, słowo) i zaczyna sprawdzać, czy długość słowa jest większa niż podana liczba, jeśli tak to mam skrócić napis do takiej liczby liter, ile użytkownik podał w wcześniej.

Teraz właśnie nie wiem jak sprawdzić ile liter ma dane słowo, aby móc porównać i jak mam wpisać w odpowiednie miejsce to '\0'. Nie mówiąc już o stworzeniu funkcji, tak aby zwracała odpowiednie wartości do odpowiednich komórek z odpowiednie ściętymi słowami. :D

Mam nadzieję, że zrozumiałeś co chcę przekazać. ;P

Powiem tak. Najłatwiej jest po prostu wpisać, że dla

tablica.napis[tablica.liczba]='\0';

Ale muszę sprawdzić najpierw ile znaków ma mój wyraz, a strasznie komplikuje sprawę ta tablica, której typem jest struktura danych.

1

masz, kombinuj https://ideone.com/USEAh8

0

O stary... Dzięki za poświęcenie. ^^ Tyle, że to miało być w tablicy której typem jest ta struktura- w sensie

a tab[4];
i funkcja ma zwracać wartości dla
for(i=0;i<4;i++)
{
f(tab[i])
}

Ale spoko poradzę sobie :), teraz tylko rozczytać to wszystko... :D

Dzięki jeszcze raz!

0
Proxima napisał(a):

W sumie, jedyne co Ty tu robisz, to kilka razy sprawdzasz czy w stringu napis nie ma NULLa.
Z tego co wyczytałem, chcesz zrobić coś takiego, tak?
\0 to nie jest 0, tylko koniec stringa, i funkcją getline() go nie wczytasz.

#include <iostream>
using namespace std;
int main() {
std::string napis;
int liczba;
std::cin >> liczba;
std::cin >> napis;
if(liczba < napis.size()) napis+="\0";
}
  1. jak w stringu może byc NULL?

2)'\0' to jest właśnie '0'.

 if(liczba < napis.size()) napis+="\0";

nic nie zmieni, bo na koncu napisu jest już '\0'.

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