Łańcuchy znaków - string

Łańcuchy znaków - string
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

Mam taki problem mam napisać kod który przekopiuje zawartość tab1 i tab2 do tab3

Kopiuj
char tab1[20]="ogniem i mieczem";
char tab2[20]="patykiem i wodą";
char tab3[100];

i wyświetli mi

Kopiuj
ogniem i mieczem patykiem i wodą

wiem ze jak zrobię tak

Kopiuj
for(i=0; tab1[i]!=NULL; i++)
{
                tab3[i]=tab1[i];
}
tab3[i]=NULL;

to elegancko kopiuje tab1 do tab3 ale jak dołożyć druga tablice to już nie daje rady

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
0

Da radę jak zrobisz to poprawnie. Pokaż jak kopiujesz drugą tablicę

MJ
  • Rejestracja: dni
  • Ostatnio: dni
0

Zamiast Od razu zakończyć łańcuch po tej pętli wstaw znak spacji, a potem przypisz resztę stringa.

Kopiuj
while(tab3[i] = tab1[i++]);
tab3[i - 1] = " ";
int j = 0;
while(tab3[j + i] = tab2[j++]);
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0
Kopiuj
  char tab1[20]="ogniem i mieczem";
  char tab2[20]="patykiem i wodą";
  char tab3[100];

  char* p = tab3; // wskazuje na aktualny znak w tekscie wynikowym (znak 0)
  char* t = tab1; // wskazuje na pierwszy znak w tekscie tab1

  while (*t) // dopoki znakw w tekscie 3 jest rozny od 0
    *p++ = *t++; // przepisz znak, zwiesz oba wskazniki

  t = tab2; // wskazuje na pierwszy znak w tekscie tab2

  while (*t) // dopoki znakw w tekscie 2 jest rozny od 0
    *p++ = *t++; // przepisz znak, zwiesz (przesun) oba wskazniki

  *p = 0; // zakoncz tekst

jeszcze można tak:
sprintf(tab3,"%s%s",tab1,tab2);

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

Sorki, że nie odpisywałem ale musiałem uczyć się czegoś innego.
A propos tych łańcuchów dałoby się to jakoś jaśniej wytłumaczyć?? Nie czuje tego

jedyne co mi do głowy przychodzi

Kopiuj
{
        int i, j;
        char tab1[20]="ogniem i mieczem";
        char tab2[20]="patykiem i wodą";
        char tab3[100];

        for(i=0; tab1[i]!=NULL; i++)
        {
                tab3[i]=tab1[i];

        }
        tab3[i]=NULL;

        printf("%s", tab3);

        printf(" %s \n", tab2);

        system("pause");

        return 0;
}

ale to chyba nie oto w tym chodzi

Tattva
  • Rejestracja: dni
  • Ostatnio: dni
0

MJay już ci podał rozwiązanie. W tym co ty przedstawiłeś nie skopiowałeś drugiej tablicy tylko ją wyświetliłeś. Więc wyjście będzie takie samo ale działanie zupełnie inne.

Końcem C-stringa jest bajt zerowy (używany jako znacznik). Więc robisz tak.

  1. Kopiujesz tab1 do tab3.
  2. W miejsce bajtu zerowego który się skopiował wpisujesz spacje ' '.
  3. Następnie dalej kopiujesz do tab3 tab2.
  4. Wyświetlasz całość z tab3.

Przeczytaj sobie o C-stringach, czym są i co oznacza ich koniec.

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

to co MJay napisał nie chce działać
tab3[i - 1] = " "; ta linijka ma błąd

Tattva
  • Rejestracja: dni
  • Ostatnio: dni
0

U mnie to działa

Kopiuj
    int i = 0;

    while(tab3[i] = tab1[i++]);
    tab3[i - 1] = ' ';
    int j = 0;
    while(tab3[j + i] = tab2[j++]);

    cout << tab3;
    
MJ
  • Rejestracja: dni
  • Ostatnio: dni
0

On pisze w C a nie w C++ zapewne, dlatego definicje i i j powinny być u góry a wypisanie powinno być printf("%s", tab3); i tak jak zauważył Tattva powinno być ' ' zamiast " "

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

zrobiłem tak

Kopiuj
{
        int i;
        int j=0;
        char tab1[20]="ogniem i mieczem";
        char tab2[20]="patykiem i wodą";
        char tab3[100];

        for(i=0; tab1[i]!=NULL; i++)
        {
                tab3[i]=tab1[i];

        }

        while(tab3[i] = tab1[i++])
        {
                tab[i-1] = ' ';
        }

        while(tab3[j + i] = tab2[j++])
        {
                printf("%s", tab3);
        }

        system("pause");

        return 0;
}
TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Proponuję takie coś: :)

Kopiuj
#include <stdio.h>

/* Laczy src1 i src2, wstawiajac miedzy nie spacje. Zapisuje wynik w dest. */
void strCat(char* dest, char* src1, char* src2) {
	while (( *dest++ = *src1++ ));   /* Kopiuje src1 do dest lacznie z '\0'. */
	*(--dest)++ = ' ';               /* Zastepuje '\0' znakiem ' '.          */
	while (( *dest++ = *src2++ ));   /* Dodaje src2 do dest lacznie z '\0'.  */
}

int main(int argc, char* argv[]) {
	char tab1[] = "ogniem i mieczem";
	char tab2[] = "patykiem i woda";
	char tab3[100];
	
	strCat(tab3, tab1, tab2);
 
	puts(tab3);
	
	return 0;
}
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

zrobiłem tak tylko spacji mi nie wbija

Kopiuj
{
        int i, j;
        char tab1[20]="ogniem i mieczem";
        char tab2[20]="patykiem i wodą";
        char tab3[100];

        for(i=0; tab1[i]!=NULL; i++)
        {
                tab3[i]=tab1[i];
        }
        while(tab3[i]=tab1[i+1])
        {
                tab3[i]=' ';
        }

        for(j=0; tab2[j]!=NULL; j++)
        {
                tab3[j+i]=tab2[j];
        }

        printf("%s", tab3);

        system("pause");

        return 0;
}
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

co jest nie tak że spacja nie wchodzi

a jak dodam to, po pierwszej pętli to pojawiają sie smieci

Kopiuj
while(tab3[i] = tab1[i++])
        {
                tab3[i - 1] = ' ';
        }
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

mogę liczyć jeszcze na pomoc czy nie??

MJ
  • Rejestracja: dni
  • Ostatnio: dni
0
  •    while(tab3[i]=tab1[i+1])** - w tej linii **i** jest stałe, ta pętla powinna chodzić w nieskończoność
    

Już dostałeś 3 rozwiązania, albo i więcej.

Z kolei w tym przykładzie:

Kopiuj
while(tab3[i] = tab1[i++])
        {
                tab3[i - 1] = ' ';
        }

Powinien pojawić się Access Violation. Bo jeżeli i == 0 to próbujesz do tab[0 - 1] = ' '; == tab[-1] = ' '; a to nie jest prawdą.
Jeżeli znowu nie zerujesz i, to dopisujesz dalej tylko spacje. Jeżeli byś wyzerował i a raczej ustawił na i = 1, to znowu uzupełnisz całą tablicę oprócz pierwszego znaku spacjami.

Przeglądnij kod i postaraj się go zrozumieć, a potem jak będziesz chciał spróbuj to zrobić za pomocą pętli for tak jak ty to chciałeś

Kopiuj
#include <stdio.h>

int main(void)
{
     int i = 0, j = 0;
     char tab1[] = {"Ogniem i mieczem"};
     char tab2[] = {"Patykiem i woda"};
     char tab3[40];
     while(tab3[i] = tab1[i++]);
     tab3[i - 1] = ' ';
     while(tab3[j + i] = tab2[j++]);

     printf("%s", tab3);
     return 0;
}
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0
Kopiuj
    for(i=0; tab1[i]!=NULL; i++)
        {
                tab3[i]=tab1[i];
        }
        while(tab3[i]=tab1[i+1])
        {
                tab3[i-1]=' ';
        }

        for(j=0; tab2[j]!=NULL; j++)
        {
                tab3[j+i]=tab2[j];
        }
        tab3!=NULL;

        printf("%s \n", tab3);

nie działa, proszę po prostu popraw mój kod bo chce dodać co piszecie i nic nie wychodzi

MJ
  • Rejestracja: dni
  • Ostatnio: dni
0

Owszem działa, dodaj getchar(); na końcu, przed return 0;

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

nic to nie dało tylko error wywala.
proszę tylko o poprawienie tego co napisałem bo to co wy mi dajecie, to nic nie rozumiem, albo napiszcie cały kod od a do b ale jakąs prosta metodą

MJ
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
#include <stdio.h>
 
int main(void)
{
     int i = 0, j = 0;
     char tab1[] = {"Ogniem i mieczem"};
     char tab2[] = {"Patykiem i woda"};
     char tab3[40];

     { 
          int dlugosc = 0;
          while(tab1[dlugosc++]);
          for(i = 0; i < dlugosc; ++i)
               tab3[i] = tab1[i];

          tab3[i - 1] = ' ';

          while(tab2[j++]);
          for(i = 0; i < j; ++i)
               tab3[i + dlugosc] = tab2[i];
     }
     printf("%s", tab3);

     {
          char c;
          scanf("%c", &c);
     }
     return 0;
}
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

czyli mam rozumieć że tego co ja zrobiłem się bieda dokończyć,
prostytutka nie rozumiem tego, nie dajecie tych klamer i mam problem z odczytaniem co do czego

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

albo inaczej. co mam tutaj dopisać żeby była ta spacja

Kopiuj
#include <stdio.h>
#include <stdlib.h>

main()
{
        int i, j;
        char tab1[20]="ogniem i mieczem";
        char tab2[20]="patykiem i woda";
        char tab3[100];

        for(i=0; tab1[i]!=NULL; i++)
        {
                tab3[i]=tab1[i];
        }

        for(j=0; tab2[j]!=NULL; j++)
        {
                tab3[j+i+1]=tab2[j];
        }
        tab3!=NULL;

        printf("%s \n", tab3);

        system("pause");

        return 0;
}
MJ
  • Rejestracja: dni
  • Ostatnio: dni
1

Masz to marudo..

Kopiuj
#include <stdio.h>

int main(void)
{
     int i = 0, j = 0;
     char tab1[] = {"Ogniem i mieczem"};
     char tab2[] = {"Patykiem i woda"};
     char tab3[40];

		for(i=0; tab1[i]!=NULL; i++)
		{
			tab3[i]=tab1[i];
		}

		tab3[i++] = ' ';

		for( ; tab2[j]!=NULL ; )
		{
			tab3[i++]=tab2[j++];
		}
		tab3[i] = NULL;

     printf("%s", tab3);
	 {
		 char c;
		 scanf("%c", &c);
	 }
     return 0;
}
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

nie działa ;/

MJ
  • Rejestracja: dni
  • Ostatnio: dni
1

To w takim układzie masz zepsuty kompilator. Radzę zainwestować w nowy.

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
0

Dlaczego chcesz zrobić to w jakiś dziwaczny sposób, do tego są odpowiednie funkcje:

Kopiuj
#include <stdio.h>
#include <string.h>
 
int main(void) {
  char str1[] = "Ogniem i mieczem";
  char str2[] = "Patykiem i woda";
  char dest[40];
  size_t str1_len = strlen(str1);
 
  strcpy(dest, str1);
  dest[str1_len] = ' ';
  strcpy(dest + str1_len + 1, str2);
 
  printf("%s", dest);
         
  return 0;
}
H4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 107
0

a co do "nie działa", to działa

Kopiuj
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     int i = 0, j = 0;
     char tab1[] = {"Ogniem i mieczem"};
     char tab2[] = {"Patykiem i woda"};
     char tab3[40];

                for(i=0; tab1[i]!=NULL; i++)
                {
                        tab3[i]=tab1[i];
                }

                tab3[i++] = ' ';

                for( ; tab2[j]!=NULL ; )
                {
                        tab3[i++]=tab2[j++];
                }
                tab3[i] = NULL;

     printf("%s", tab3);
         {
                 char c;
                 scanf("%c", &c);
         }

         system("PAUSE");
     return 0;
}

system("PAUSE");

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0

jak ktoś jest głupi to zawsze mu coś nie działa

BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0
Kopiuj
#include <stdio.h>
#include <stdlib.h>

main()
{
        int i, j;
        char tab1[20]="ogniem i mieczem";
        char tab2[20]="patykiem i woda";
        char tab3[100];

        for(i=0; tab1[i]!=NULL; i++)
        {
                tab3[i]=tab1[i];
        }

        tab3[i++]=' ';

        for(j=0; tab3[j]!=NULL; j++)
        {
                tab3[j+i]=tab2[j];
        }
        tab3[j+i]!=NULL;

        printf("%s \n", tab3);

        system("pause");

        return 0;
}

zrobiłem to tak i dział

dlaczego chce to zrobić w dziwaczny sposób??? Ponieważ mam wykorzystać to co braliśmy na lekcji a więcej nie braliśmy

do czego to służy ??

Kopiuj
char c;
scanf("%c", &c);

Musze jeszcze zrobić żeby mi policzyło ile jest wyrazów w zdaniu tak ze jak podaje znak to pokaże ile razy on występuje.

poza tym widzę ze macie mnie już dosyć, rozumiem dlaczego i sorki za ostatnie ale miałem już zaj****** nerwe, bo mi to nie chciało działać a cały wieczór na to poświęciłem.

MJ
  • Rejestracja: dni
  • Ostatnio: dni
0
  1. zajebiste to nie przekleństwo, więc można tu używać.
  2. Mamy dosyć, bo nie słuchasz tego co się do Ciebie mówi. Twój sposób jest najgorszy ze wszystkich, mimo to chciałeś go użyć. Poza tym nic z pokazanych przez nas rozwiązań nie wykracza poza zakres podstawowych podstaw i coś takiego jak while() powinno być w tym samym momencie przedstawiane co for(;;).
  3. char c; scanf("%c", &c); - czeka na wprowadzenia jakiegokolwiek znaku i potwierdzenie enterem, zatrzymuje obraz programu, gdyż okno powinno tylko mignąć, jeżeli go w jakiś sposób nie wstrzymasz.
  4. Strzelam, że jesteś na pierwszym roku na agh, albo macie podobne zadania, do tych co miałem rok temu. Aby policzyć ilość słów, policz ile masz znaków białych w tekscie. Czyli jeżeli **znak == ' ' || znak == '\n' || znak == '\t' **
    Co do zliczania liter stworz sobie tablice int litery[26]; - bo jest 26 liter w alfabecie, a potem iterując po każdej literze z tekstu w pętli
Kopiuj
int iter = 0;
do
{
     litery[tab3[iter] - 'a']++;
}while(tab3[iter++]);

Następnie wyświetl tylko te litery których wartość jest różna od 0:

Kopiuj
for(int i = 0; i < 26; ++i)
     if(!litery[i])
          break;
     printf("%c - wystapil %d razy\n", i + 'a', litery[i]);

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.