Łańcuchy znaków - string

0

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

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

i wyświetli mi

ogniem i mieczem patykiem i wodą

wiem ze jak zrobię tak

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

0

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

0

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

while(tab3[i] = tab1[i++]);
tab3[i - 1] = " ";
int j = 0;
while(tab3[j + i] = tab2[j++]);
0
  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);

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

{
        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

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.

0

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

0

U mnie to działa

    int i = 0;

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

    cout << tab3;
    
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 " "

0

zrobiłem tak

{
        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;
}
0

Proponuję takie coś: :)

#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;
}
0

zrobiłem tak tylko spacji mi nie wbija

{
        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;
}
0

co jest nie tak że spacja nie wchodzi

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

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

mogę liczyć jeszcze na pomoc czy nie??

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:

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ś

#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;
}
0
    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

0

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

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ą

0
#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;
}
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

0

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

#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;
}
1

Masz to marudo..

#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;
}
0

nie działa ;/

1

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

0

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

#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;
}
0

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

#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");

0

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

0
#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 ??

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.

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
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:

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

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