Kopiowanie i porównywanie napisów

Wskaźniki i napisy w tablicach char - Podstawy C++ (C++)

Tablic nie da się przypisać operatorem = ani porównać przez == (to porównałoby adresy). copy przepisuje znaki razem z '\0', a same porównuje znak po znaku. Biblioteka cstring ma odpowiedniki strcpy i strcmp oraz strcat, która dopisuje napis na końcu; tablica docelowa musi mieć miejsce na wszystkie znaki i '\0'.

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

// dlugosc napisu: liczymy znaki do '\0'
int length(const char *s) {
  int n = 0;
  while (s[n] != '\0') {
    n++;
  }
  return n;
}

// slowo zaczyna sie tam, gdzie po spacji (albo na poczatku) stoi inny znak
int countWords(const char *s) {
  int words = 0;
  bool inWord = false;
  for (int i = 0; s[i] != '\0'; i++) {
    if (s[i] == ' ') {
      inWord = false;
    } else if (!inWord) {
      words++;
      inWord = true;
    }
  }
  return words;
}

// litery maja kolejne kody: 'a' = 97 ... 'z' = 122, 'A' = 65 ... 'Z' = 90
void toUpper(char *s) {
  for (int i = 0; s[i] != '\0'; i++) {
    if (s[i] >= 'a' && s[i] <= 'z') {
      s[i] = s[i] - 'a' + 'A';
    }
  }
}

// odwracanie w miejscu: zamiana pierwszego z ostatnim, drugiego z przedostatnim...
void reverse(char *s) {
  int n = length(s);
  for (int i = 0; i < n / 2; i++) {
    char temp = s[i];
    s[i] = s[n - 1 - i];
    s[n - 1 - i] = temp;
  }
}

bool isPalindrome(const char *s) {
  int n = length(s);
  for (int i = 0; i < n / 2; i++) {
    if (s[i] != s[n - 1 - i]) {
      return false;
    }
  }
  return true;
}

// kopiowanie znak po znaku razem z koncowym '\0'
void copy(char *dst, const char *src) {
  int i = 0;
  while (src[i] != '\0') {
    dst[i] = src[i];
    i++;
  }
  dst[i] = '\0';
}

// rowne napisy: te same znaki az do '\0' (operator == porownalby adresy)
bool same(const char *a, const char *b) {
  int i = 0;
  while (a[i] != '\0' && a[i] == b[i]) {
    i++;
  }
  return a[i] == b[i];
}

int main() {
  char word[] = "Ala";
  // napis to tablica znakow zakonczona znakiem '\0' (kod 0)
  for (int i = 0; i < 4; i++) {
    cout << i << ": kod " << (int)word[i];
    if (word[i] != '\0') {
      cout << ", znak " << word[i];
    }
    cout << endl;
  }
  cout << word << endl;
  char text[] = "Ala ma kota";
  cout << "dlugosc: " << length(text) << ", strlen: " << strlen(text) << endl;
  cout << "slowa: " << countWords(text) << endl;
  toUpper(text);
  cout << text << endl;
  reverse(text);
  cout << text << endl;
  cout << "kajak: " << isPalindrome("kajak") << ", kotek: " << isPalindrome("kotek") << endl;
  char backup[20];
  copy(backup, "kot");
  strcat(backup, "ek"); // biblioteka cstring: dopisanie na koncu
  cout << backup << ": kotek " << same(backup, "kotek") << ", kotki " << same(backup, "kotki") << endl;
  return 0;
}

Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.

Wszystkie lekcje kursu Podstawy C++·Zaloguj się, aby zapisać postęp na koncie.