• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie. Błędny kod.

Object Storage Arubacloud
0 głosów
354 wizyt
pytanie zadane 24 maja 2015 w C i C++ przez Mateep Użytkownik (850 p.)
progam pobierający od uzytkownika dwa ciągi znaków i póżniej dołącza jeden na końcu drugiego.

pomysł miałem taki: ale coś nie gra ;/

#include <stdio.h>

void strcat(char* a, char* b)
    {
        int i=0,j=0;
                   //dlugosc s
        while (*a)
        {
            a++;
            i++;
        }
            //printf("%d",i);

            //przypisywanie t do s
        do
        {
            *(a+i)=*(b+j);
            i++;
            j++;
        }while(*b!='\0');

        i=0;
        
        //wyswietlenie polaczonych
        do
        {
        printf("%c",*(a+i));
        i++;
        }while(*a!='\0');
    }

int main()
{
    char s[40];
    char t[20];
    int i=0;

    char *ss;
    char *tt=t;

    //pobranie ciągów s i t
    puts("podaj ciag znakow s:");
    gets(s);
    puts("podaj ciag znakow t:");
    gets(t);

    strcat(s,t);

 

return 0;
}

1 odpowiedź

0 głosów
odpowiedź 24 maja 2015 przez Domagalsky Obywatel (1,000 p.)
#include <stdio.h>

void strcat(char* a, char* b)
    {
        int roz_A=0,roz_B=0;
        printf("\n1 petla");
        while (*a)
        {
            a++;
            roz_A++;
            printf("\nAdres a %d",a);
        }
        
		
        printf("\n2 petla");
		do
        {
            *a=*b;
            a++;
            b++;
            roz_B++;
			printf("\nAdres a %d, Adres b %d",a,b);           
        }while(*b);
        
		printf("\nRozm A+B:  %d",roz_A+roz_B);
		do{
			a--;
			roz_A+roz_B--;
		}while((roz_A+roz_B)!=0);
		
		printf("\nWynik koncowy: ");
        do
        {
        printf("%c",*a);
		a++;
        }while(*a);
    }

int main()
{
    char s[40];
    char t[20];
    int i=0;

    char *ss;
    char *tt=t;

    //pobranie ciągów s i t
    puts("podaj ciag znakow s:");
    gets(s);
    puts("podaj ciag znakow t:");
    gets(t);

    strcat(s,t);

 

return 0;
}

Problem tkwił w fakcie, iż posługujesz się wskaźnikami.
Wykonując operację a++, zmieniasz adres z np. Śląska 32, na Śląska 33;, dlatego potrzebujesz dodatkowo licznika, który będzie zliczać o ile adresów się przesunąłeś.


Wchodząc do kolejne pętli, nie potrzebujesz zmieniać adresu wskaźnika a, gdyż jesteś już na kolejnym wolnym adresie(bo zmieniłeś go w 1 pętli), więc wpisujemy *a=*b, następnie zmieniamy adres a++ oraz b++, tutaj również przyda nam się licznik.

Teraz wystarczy cofnąć się na adres początkowy tablicy a. W tym wypadku jest to suma licznik_A+licznik_B;

Jeżeli masz jakieś pytania to wal śmiało wink

Ps. Taka moja mała rada: nie bądź "rasistą iteracyjnym", iteracje nie muszą nazywać się i czy j, warto czasami je nazwać w sposób bardziej przejrzysty. Skoro zmienna ma przechowywać pewną liczbę kroków, czy nie warto nadać jej nazwę licznik_Czego++;?

komentarz 24 maja 2015 przez Mateep Użytkownik (850 p.)
Dzięki za pomysł i dobre rady :)

w międzyczasie wymyśliłem inne rozwiązanie tego + jest dalszaczęśc zadania czyli zliczanie ile razy wystąpiła jakaś literka. jak byś był zainteresowany moim pomysłem to łap

PS pisałem zanim odczytałem twój komentarz więc  iteracje nadal są "rasistowskie"ale postaram się popracować nad czytelnością kodu :)

#include <stdio.h>

void strcat(char* s, char* t)
    {
        int i=0,j=0;
        while(s[i]!='\0')i++;
        //while((s[i++]=t[j++])!='\0');
        while((*(s+i)=*(t++))!='\0')i++;
    }

int find(char* s,char a)
{
    int i=0,x=0;
    do
    {
        if(*(s+i) == a)x++;

        i++;
    }while(*(s+i)!='\0');

return x;
}

int main()
{
    char s[40];
    char t[20];
    int i=0,size=0;
    char a;

    char *ss;
    char *tt=t;

    //pobranie ci¹gów s i t
    puts("podaj ciag znakow s:");
    gets(s);
    puts("podaj ciag znakow t:");
    gets(t);

    strcat(s,t);
puts("polaczone dwa lancuchy:\n");
    do{
        printf("%c",s[i]);
        i++;
    }while (s[i]!='\0');

    puts("\n\npodaj literke:");
    scanf("%c",&a);
    puts("wystapila ona:");
    printf("%d razy.",find(s,a));

return 0;
}
komentarz 24 maja 2015 przez Mateep Użytkownik (850 p.)
+mam uwagę co do Twojego kodu. mianowicie wynik końcowy  źle wyświetla, bo po tym co ja wprowadzę są jakieś szlaczki.
komentarz 24 maja 2015 przez Domagalsky Obywatel (1,000 p.)
edycja 24 maja 2015 przez Domagalsky

A mogę zapytać co wprowadzasz?


U mnie działa bez zarzutu na Ubuntu i W8.

Każde rozwiązanie prowadzące do poprawnego wyniku konicowego jest dobre.
Pamiętaj, że nie ma programów idealnych, każdy można jakoś ulepszyć, aby wykonywał się szybciej.
 

komentarz 24 maja 2015 przez Mateep Użytkownik (850 p.)

Ciekawa sprawa jestem na Windows 8.

i na prawdę nie wiem co jest grane ale na załączonym obrazku widać, że coś jest nie tak.

komentarz 25 maja 2015 przez Domagalsky Obywatel (1,000 p.)
char s[40]={0};
char t[20] = {0};

Spróbuj, może pomoże.

Podobne pytania

0 głosów
1 odpowiedź 550 wizyt
pytanie zadane 26 listopada 2017 w C i C++ przez Krystek102 Bywalec (2,440 p.)
0 głosów
1 odpowiedź 1,805 wizyt
0 głosów
1 odpowiedź 773 wizyt
pytanie zadane 15 grudnia 2020 w C i C++ przez skuero0 Nowicjusz (120 p.)

92,555 zapytań

141,402 odpowiedzi

319,537 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...