Wczytuje dwa ciągi znaków i liczy ile pierwszych znaków jest takich samych w obu ciągach.

0

Mam do napisania program, który wczytuje dwa ciągi znaków i liczy ile pierwszych znaków jest takich samych w obu ciągach.
Na razie wczytałem dwa ciągi. Tylko co dalej... Czy ktoś pomoże?

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

int main()
{
    int i, n, m;
    n=100;
    m=100;
    char *tablica1 = (char* ) malloc(n * sizeof(char));
    printf("Podaj ciag znakow: \n");
    while( scanf("%c", &tablica1[i]) == 1 )
    {
        if( tablica1[i]=='\n' )
            break;
        ++i;
    }
    char *tablica2 = (char* ) malloc(n * sizeof(char));
    printf("Podaj ciag znakow: \n");
    while( scanf("%c", &tablica2[i]) == 1 )
    {
        if( tablica2[i]=='\n' )
            break;
        ++i;
    }

    return 0;
}

0

Już wcześniej Ci napisałem że masz niezainicjalizowaną zmienną i i próbujesz jej użyć:

int i;
...
while (scanf("%c", &tablica1[i]) == 1)

Wyjaśnij o co chodzi z "ile pierwszych znaków jest takich samych w obu ciągach".

0

Ojj.. faktycznie. Sorka
No właśnie też się zastanawiam o co chodzi. Może po prostu ile jest takich samych znaków.

1

Chodzi pewnie o coś takiego:
nieładny
niebieski

3 pierwsze znaki są takie same.

0

Faktycznie :D
Czyli można użyć pętli?

for(i=0; i<liczba_znakow_krotszego_wyrazenia; i++)
   while(tablica1[i]==tablica2[i])
       licznik++;

1

A nie możesz tak ładnie wczytywać całej linii od razu:

int main()
{
	const char size = 20;
	char *tablica1 = (char*)malloc(sizeof(char) * size);
	char *tablica2 = (char*)malloc(sizeof(char) * size);

	printf("Podaj ciag znakow: \n");
	scanf("%s", tablica1);
	printf("Podaj ciag znakow: \n");
	scanf("%s", tablica2);

	int counter = 0;
	while (*tablica1 && *tablica2) // Dopóki jest co czytać z tablicy1 albo tablicy2
	{
		if (*tablica1 == *tablica2) // Porównanie znaków
		{
			counter++;
		}
		tablica1++; // Inkrementacja adresu
		tablica2++;
	}

	printf("Dlugosc: %d\n", counter);
	return 0;
}
0

A jeszcze tak z ciekawości zapytam, dlaczego ten program nie działa? Laptop cały czas "myśli" i nie wyświetla wyniku. Jeśli nie masz czasu lub ochoty spojrzeć, to zrozumiem. :D

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

int main()
{
    int i, j, n, licznik, liczba_znakow, liczba_znakow1, liczba_znakow2;
    liczba_znakow1=0;
    liczba_znakow2=0;
    licznik=0;
    i=0;
    j=0;
    n=100;
    char *tablica1 = (char* ) malloc(n * sizeof(char));
    printf("Podaj ciag znakow: \n");
    while( scanf("%c", &tablica1[i]) == 1 )
    {
        if( tablica1[i]=='\n' )
            break;
        liczba_znakow1++;
    }
    char *tablica2 = (char* ) malloc(n * sizeof(char));
    printf("Podaj ciag znakow: \n");
    while( scanf("%c", &tablica2[j]) == 1 )
    {
        if( tablica2[j]=='\n' )
            break;
        liczba_znakow2++;
    }
    if (liczba_znakow1>=liczba_znakow2)
        liczba_znakow=liczba_znakow2;
    else
        liczba_znakow=liczba_znakow1;
    for(i=0; i<liczba_znakow; i++)
        while(tablica1[i]==tablica2[i])
            licznik++;
    printf("Wystepuje '%d' takich samych pierwszych znakow", licznik);
    return 0;
}

0

Pewnie wisisz tutaj:

for (i = 0; i<liczba_znakow; i++)
	while (tablica1[i] == tablica2[i])
		licznik++;

Jeżeli raz while będzie prawdą to już nigdy stamtąd nie uciekniesz :D

0

No tak. Masz rację. A masz jakiś pomysł jak z tego wybrnąć? :)

0

Próbowałem coś takiego, ale za każdym razem wynik to 1

for(i=0; i<liczba_znakow; i++)
        if(tablica1[i]==tablica2[i])
            licznik++;
        else
            break;
0

Problem masz taki że cokolwiek wpisujesz ląduje pod ten sam adres.
Zobacz Twój kod:

while (scanf("%c", &tablica1[i]) == 1)
{
	if (tablica1[i] == '\n')
		break;
	liczba_znakow1++;
}

Zmienna i cały czas jest równa 0 i tam wpisywane są znaki. Po otrzymaniu nowej linii wpisywana jest ona znów to samo miejsce. Więc twoja tablica wygląda tak że masz 1 znak \n a potem jakieś bzdurne wartości z pamięci.

Musisz inkrementować i aby dodawać kolejne znaki pod kolejne adresy.

Przydałoby się również zakończyć całość tzw. Null-Terminatorem \0

0

Faktycznie... Teraz działa :D
Jesteś niesamowity ;) Podziwiam za wiedzę i cierpliwość.

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