Łańcuchy znaków. Inicjalizacja łańcucha znaków. Stała znakowa. Funkcje do wprowadzania i wyprowadzania znaków. Plik nagłówkowy string.h (cstring). Przykłady kodu w C/C++. Szkielet programu do wczytywania z konsoli mieszanego łańcucha znaków ze spacjami oraz segmentacji wprowadzonego łańcucha ze względu na występujące w nim spacje. Po segmentacji program ma wykonać zadane operacje na poszczególnych albo wszystkich elementach łańcucha.
#include "stdafx.h"
#include <iostream>
#include <cstring>
// Stale okreslajace wielkosc zalokowanej pamieci dla wykorzystywanych tablic
const int ArrSize = 50;
const int tempArrSize = 50;
/**
*
* Program Główny prezentujący funckje C++ wyprowadzania treści na wyjście konsoli.
* Trzy strategie (szkielety) algorytmow do zliczania ilosci slow (tokenow) w podanym przez
* uzytkownika lancuchu znakow.Prosze zwrocic uwage na interpretacje znaku spacji. Algorytmy
* w najprostszej postaci nie chronia przed podwojnymi spacjami. Mozna to wykryc poprzez wprowadzenie
* nastepujacego lancucha znakow: "1 2 3 "
*
* @author Marcin Mirończuk
*
*/
int main()
{
// Tablica przechowujaca lancuch podany przez uzytkownika
char slowa[ArrSize];
// Wprwadzanie lancucha znakow
std::cout << "Podaj slowa: " << std::endl;
std::cin.getline(slowa, ArrSize);
/**
* Strategia nr I - rozwiazanie podstawowe
*
*/
// Ustawienie zmiennych tymczasowych
int k = 0;
int iloscSlow = 0;
// Przetwarzanie wprowadzonego lanucha znakow
for(int i = 0; i < strlen(slowa); i++) {
// Tymczasowa tablic do przechowywania znakow a nastepnie lanucha znakow w postaci osobnych tokenow
char temp[tempArrSize];
// Najprostszy sposob wykrywania spacji oraz konca lancucha
if(isspace(slowa[i]) || slowa[i+1] == '\0') {
temp[k] = '\0';
iloscSlow++;
k = 0;
temp[k] = '\0';
} else {
// Zapis znaku to tablicy tymczasowej
temp[k] = slowa[i];
k++;
}
}
std::cout << "Ilosc podanych slow: " << iloscSlow << std::endl;
/**
* Strategia nr II - rozwiazanie rozszerzone na wskaznikach na lanuchy znakow
*
*/
// Deklaracja zmiennej do przechowywania ilosci wykrytych slow (tokenow)
iloscSlow = 0;
// Utworzenie stalego wskaznika na wprowadzony przez uzytkownika lancuch (ochrona przed modyfikacja)
// Wksazanie pierwszego elementu tablicy slowa.
const char *pslowa = slowa;
// Iteracyjne przesowanie wskaznika
while(*pslowa) {
if(isspace(*pslowa)) {
iloscSlow++;
}
pslowa++;
}
iloscSlow++;
std::cout << "Ilosc podanych slow: " << iloscSlow << std::endl;
/**
* Strategia nr III - rozwiazanie rozszerzone z uzyciem tworzenie dynamicznej tablicy
* do alokacji nowej pamieci na wczytany lanuch znakow. Wersja uproszczona.
*
*/
// Alokacja dynamiczna nowej z zalozenia mniejszej pamieci
char *nslowa = new char[strlen(slowa) + 1];
// Skopiowanie lanucha do nowej tablicy.
// @todo wczytywanie lancucha do tabicy slowa powinno odbywac sie w fukcji. Tablica slowa powinna byc tymczasowa
strcpy(nslowa, slowa);
// Zmienna przechowujaca ilosc slow
iloscSlow = 0;
// Przetwarzanie lanucha znakow
for(int i = 0; i < strlen(nslowa); i++) {
if(isspace(nslowa[i])) {
iloscSlow++;
}
}
// Zwolnienie przydzielonej pamieci
delete [] nslowa;
iloscSlow++;
std::cout << "Ilosc podanych slow: " << iloscSlow << std::endl;
std::cin.get();
std::cin.get();
return 0;
}