Łączenie tablic char

0

Mam do zrobienia to zadanko, byłbym wdzięczny gdyby ktoś podpowiedział co jest nie tak i czy w ogóle mój kod zgada się z treścią polecenia, które brzmi:

Wczytaj z klawiatury, w sposób bezpieczny – z użyciem cin.getline(...) osobno Imie i Nazwisko do tablic znakowych char. Połącz Imie i Nazwisko w trzeciej tablicy dodając spację pomiędzy – jako wiersz tablicy dwuwymiarowej char (każda zapisana osoba jest w osobnym wierszu tablicy). Wyświetl na ekranie wszystkie zgromadzone w tablicy dane osobowe .

#include <iostream>
#include<string.h>
using namespace std;

int main()
{
    char imie[100];
    char nazwisko[100];
    cin.getline(imie, 100);
    cin.getline(nazwisko, 100);
    char razem[3][100];
    int w=0;
        for(int j=0; j<strlen(imie); j++){
            razem[w][j]=imie[j];
        }
        razem[w+1][0]=' ';
        for(int k=0; k<strlen(nazwisko); k++){
            razem[w+2][k]=nazwisko[k];
        }
    for(int i=0; i<3; i++)
    {
        cout << razem[i] << endl;
    }
    return 0;
}
0

1. Jeśli już masz tworzysz tablicę, to warto od razu wypełnić ją całą. W tym przypadku najlepiej, gdyby były to znaki końca ciągu, czyli '\0'.
2. Łączenie tablic musi odbywać się przez przekopiowywanie obu tablic do trzeciej (tak jak teraz) jednak indeksowanie tablicy jest u Ciebie mocno przekombinowane. Nie wgryzałem się dlaczego gdzieś masz w+2, a gdzieś w+1, ale wygląda to źle i utrudnia zrozumienie.
3. Do wspomnianego wcześniej przekopiowania wystarczą Ci dwie pętle. Jedna niech iteruje po pierwszej tablicy aż do napotkania w niej znaku końca '\0', druga niech iteruje po drugiej tablicy również przekopiowując zawartość aż do napotkania znaku końca. Pomiędzy tymi pętlami umieść linijkę wstawiającą spację (tak jak masz teraz) i tyle.

0

Spróbuj przerobić program wg schematu poniżej:

  1. Stwórz tablicę A, B, C
  2. Wczytaj ciąg do tablicy A
  3. Wczytaj ciąg do tablicy B
  4. Skopiuj do C[0] zawartość tablicy A
  5. Skopiuj do C[1] znak spacji oraz znak końca łańcucha znaków - '\0'
  6. Skopiuj do C[2] zawartość tablicy B

Do kopiowania zawartości ciągu znaków użyj funkcji strcpy(tablica_docelowa, tablica_źródłowa) - http://www.cplusplus.com/reference/cstring/strcpy/
Jeśli to tylko prosty program na zaliczenie to wystarczy, jeśli jednak chcesz się dalej rozwijać to warto zainteresować się dynamicznymi tablicami, a w kolejnym etapie std::string

0

Zrobiłem to tak, że w pierwszej pętli for wypełniam pierwszy wiersz tablicy imieniem(przekopiowuję pojedynczo znaki z tablicy imie), potem jest to razem[w+1][0]=' '; czyli moja spacja a potem wypełniam nazwiskiem trzeci wiersz tablicy razem.
Na początku zadeklarowałem int w=0; potem dawałem w+1 i w+2, są to kolejne wiersze tablicy razem, nie wiedziałem jak zrobić to w pętli for więc zrobiłem tak.

0
wyebani napisał(a):

Spróbuj przerobić program wg schematu poniżej:

  1. Stwórz tablicę A, B, C
  2. Wczytaj ciąg do tablicy A
  3. Wczytaj ciąg do tablicy B
  4. Skopiuj do C[0] zawartość tablicy A
  5. Skopiuj do C[1] znak spacji oraz znak końca łańcucha znaków - '\0'
  6. Skopiuj do C[2] zawartość tablicy B

Do kopiowania zawartości ciągu znaków użyj funkcji strcpy(tablica_docelowa, tablica_źródłowa) - http://www.cplusplus.com/reference/cstring/strcpy/
Jeśli to tylko prosty program na zaliczenie to wystarczy, jeśli jednak chcesz się dalej rozwijać to warto zainteresować się dynamicznymi tablicami, a w kolejnym etapie std::string

Tylko w poleceniu jest żeby zrobić to na dwuwymiarowych tablicach.

0

Wiem, widzę ale przepisywanie znak po znaku jest zbędne no i po spacji nie dodałeś '\0' przez co twoja tablica ma spacje i 99 znaków "śmieci".

Nie napisałeś też jaki masz problem. Ale podejrzewam, że jak dodasz po dodaniu spacji :
razem[w+1][1] = '\0';
To problem może zniknąć.

0

Gdy wpisałem coś takiego razem[w+1][1]={'\0'}; to zamiast spacji wstawia mi litere 'f' i czasem jakieś pojedyncze znaczki przy imieniu i nazwisku

0

Prosiłem, abyś wpisał inaczej:
razem[w+1][0]=' ';
razem[w+1][1] = '\0';

Bez klamr.

0

o teraz lepiej tylko dalej czasem wyświetlają się dziwne znaczki przy imieniu i nazwisku

0

Zmień w obu pętlach warunek:
for(int j=0; j<=strlen(imie); j++)
for(int =0; k<=strlen(nazwisko); k++)

0

Działa super, dzięki! Czemu trzeba było dać <= ?

0
Tomek Nadrowski napisał(a):

Działa super, dzięki! Czemu trzeba było dać <= ?

Ponieważ stringi są zakończone bajtem zerowym - masz w tablicy tak naprawdę {'k', 'o', 'w', 'a', 'l', 's', 'k', 'i', 0}. Wszystkie funkcje, które operują na stringach działają aż do takiego "końca". Jak tego końca nie skopiujesz, to dalej będą jakieś dane w pamięci, które też będą przeczytane.

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