Funkcje pracujące na ciągach znaków

0

Jestem kompletnym laikiem z języka C. Proszę o pomoc w napisaniu funkcji pracujących na ciągach znaków. Mam takie zadanie:

  • drukuj_stringa - ma wypisać na wyjście standardowe ciąg znaków str z użyciem funkcji putchar(int);
  • dlugosc_stringa - ma zwrócić długość ciągu znaków;
  • dopisz_stringa - ma dopisać ciąg znaków dopisz_mnie na końcu stringa cel. Przy czym tablica cel ma cel_n znaków. Jeżeli cel nie zmieści się w tablicy cel, to należy dopisać tyle znaków z ciągu znaków dopisz_mnie ile się zmieści. Ostatnim dopisanym znakiem musi być znak 0;
  • int_to_string - ma zamienić liczbę x do postaci ciągu znaków i zapisać wynik w tablicy cel. Tablica cel ma długość cel_n znaków. Jeżeli nie wszystkie znaki zmieszczą się w cel to zapisać tyle znaków ile się zmieści;
  • szukaj_w_stringu - funkcja ma zwrócić pozycję pierwszego wystąpienia ciągu znaków szukaj_tego w ciągu znaków szukaj_tutaj. Jeżeli ciąg szukaj_tego nie występuje w ciągu szukaj_tutaj, to funkcja ma zwrócić -1.

Mam zaimplementować następujące funkcje:

void drukuj_string(char *str);
int dlugosc_stringa(char *str);
void dopisz_stringa(char *cel, int cel_n, char *dopisz_mnie);
void int_to_string(char *cel, int cel_n, int x);
int szukaj_w_stringu(char *szukaj_tutaj, char *szukaj_tego);
#include <stdio.h>
#include <string.h>

void drukuj_string(char *str)
{
   int i;
   for(i=0; i<=str[0]; i++){
   if(str[i] !=0) {
   putchar(str[i]);
                 }
   }
}

int dlugosc_stringa(char *str, unsigned int rozmiar)
{
    if (strlen(str) > rozmiar)
        *(str + rozmiar) = '\0';
}

void dopisz_stringa(char *cel, int cel_n, char *dopisz_mnie)
{

}

void int_to_string(char *cel, int cel_n, int x)
{

}

int szukaj_w_stringu(char *szukaj_tutaj, char *szukaj_tego)
{

}

int main()
{
   char *s = "Ala ma kota";
   char p[100] = "Ala";
   char *q = " ma kota";
   char *pusty = "";

   drukuj_string(s); // wypisz za pomoca putchar

   printf(" \nDlugosc stringa: %d\n", dlugosc_stringa(s,20));
   dopisz_stringa(p, 100, q);
   drukuj_string(p);
   szukaj_w_stringu("Ala ma kota", "ma"); // zwroc 4

return 0;
}
0

Ok, w czym jest problem?

0

Nie mam pomysłu jak się zabrać za te 3, 4 i 5 funkcję :/

0

Może zacznij od napisania drugiej, bo będziesz jej potrzebował.

0

druga jest napisana

0

Przepraszam. Zacznij od napisania poprawnie drugiej.

0

a co w niej jest nie tak?

0

dlugosc_stringa - ma zwrócić długość ciągu znaków;

int dlugosc_stringa(char *str, unsigned int rozmiar)
{
    if (strlen(str) > rozmiar)
        *(str + rozmiar) = '\0';
}

Gdzie zwracasz długość przekazanego ciągu znaków?

0
#include <stdio.h>
#include <string.h>


void drukuj_string(char *str)
{
   int i;
	for(i=0; i<str[i]; i++)
	{
		if(i!=str[0]){
		putchar(str[i]);
		}
	}
}

int dlugosc_stringa(char *str)
{
int i, j=0;
    for(i=0; i<str[i]; i++)
	{
    if(i!=str[0]) j++;
	}
	return(j);


}
void dopisz_stringa(char *cel, char *dopisz_mnie)
{
int i,j;
	for(i=0; i<cel[i]; i++)
	{
		if(i!=cel[0]){
		putchar(cel[i]);
		}
	}
	for(i=0; i<dopisz_mnie[i]; i++)
	{
		if(i!=dopisz_mnie[0]){
		putchar(dopisz_mnie[i]);
		}
	}
}
void int_to_string(char *cel, int x)
{

}
int szukaj_w_stringu(char *szukaj_tutaj, char *szukaj_tego)
{

}
int main(int argc, char ** argv)
{

   char *s = "Ala ma kota";
   char p[100] = "Ala";
   char *q = " ma kota";
   char *pusty = "";


   drukuj_string(s); // wypisz za pomoca putchar


   printf(" \nDlugosc stringa: %d\n", dlugosc_stringa(s));
   dopisz_stringa(p, q);
   // drukuj_string(p);
   szukaj_w_stringu("Ala ma kota", "ma"); // zwroc 4



return 0;


}

udało mi się 2 i 3 napisać. Do 4 nie mam w ogóle podejścia :/

0

I w drukowaniu i w liczeniu masz zły warunek: https://wandbox.org/permlink/biVAFN1AhYD1qaDt

Porównujesz indeks ze znakiem, o co chodzi?

0

Teraz lepiej?

#include <stdio.h>
#include <string.h>


void drukuj_string(char *str)
{
   int i;
	for(i=0; i<str[i]; i++)
	{
		if(0!=str[0]){
		putchar(str[i]);
		}
	}
}

int dlugosc_stringa(char *str)
{
int i, j=0;
    for(i=0; i<str[i]; i++)
	{
    if(0!=str[0]) j++;
	}
	return(j);


}
void dopisz_stringa(char *cel, char *dopisz_mnie)
{
int i,j;
	for(i=0; i<cel[i]; i++)
	{
		if(0!=cel[0]){
		putchar(cel[i]);
		}
	}
	for(i=0; i<dopisz_mnie[i]; i++)
	{
		if(0!=dopisz_mnie[0]){
		putchar(dopisz_mnie[i]);
		}
	}
}
void int_to_string(char *cel, int x)
{

}
int szukaj_w_stringu(char *szukaj_tutaj, char *szukaj_tego)
{

}
int main(int argc, char ** argv)
{

   char *s = "Ala ma kota";
   char p[100] = "Ala";
   char *q = " ma kota";
   char *pusty = "";


   drukuj_string(s); // wypisz za pomoca putchar


   printf(" \nDlugosc stringa: %d\n", dlugosc_stringa(s));
   dopisz_stringa(p, q);
   // drukuj_string(p);
   szukaj_w_stringu("Ala ma kota", "ma"); // zwroc 4



return 0;


}
0

Nie wiem o co chodzi w powyższym "dlugosc_stringa", tutaj chyba czytelniejsza wersja:

#include <stdio.h>

int dlugosc_stringa(char *str) {
	int result = 0;
	
	while(*str) {
		str++; 
		result++;
	}
	
	return result;
}

int main(void) {
	char *test = "to jest test";
	printf("Dlugosc testu [%s] = %d\n", test, dlugosc_stringa(test));
	return 0;
}

https://ideone.com/9VsbmP

0
vpiotr napisał(a):

Nie wiem o co chodzi w powyższym "dlugosc_stringa", tutaj chyba czytelniejsza wersja:

#include <stdio.h>

int dlugosc_stringa(char *str) {
	int result = 0;
	
	while(*str) {
		str++; 
		result++;
	}
	
	return result;
}

int main(void) {
	char *test = "to jest test";
	printf("Dlugosc testu [%s] = %d\n", test, dlugosc_stringa(test));
	return 0;
}

https://ideone.com/9VsbmP

W tej funkcji mam wypisac za pomocą putchar

0
void drukuj_string(char *str)
{
   int i;
    for(i=0; i<str[i]; i++)
    {
        if(0!=str[0]){
        putchar(str[i]);
        }
    }
}

Co Ty tu porównujesz?
i - indeks znaku
str[i] - znak
0 - zero
str[0] - pierwszy znak

Dlaczego porównujesz indeks znaku z jego wartością? To jest źle.

0

Czyli jak mam to poprawic?

2

Opisz słownie co chcesz zrobić, a potem ubierz to w kod.

Na początek funkcja pierwsza: tak długo jak obecny znak nie ma wartości zero, wypisz znak.

0
#include <stdio.h>
#include <string.h>


void drukuj_string(char *str)
{
   int i;
	for(i=0; i<str[i]; i++)
	{
		if(0!=str[i]){
		putchar(str[i]);
		}
	}
}

int dlugosc_stringa(char *str)
{
int i, j=0;
    for(i=0; i<str[i]; i++)
	{
    if(0!=str[i]) j++;
	}
	return(j);


}
void dopisz_stringa(char *cel, char *dopisz_mnie)
{
int i,j;
	for(i=0; i<cel[i]; i++)
	{
		if(0!=cel[i]){
		putchar(cel[i]);
		}
	}
	for(i=0; i<dopisz_mnie[i]; i++)
	{
		if(0!=dopisz_mnie[i]){
		putchar(dopisz_mnie[i]);
		}
	}
}
void int_to_string(char *cel, int x)
{

}
int szukaj_w_stringu(char *szukaj_tutaj, char *szukaj_tego)
{

}
int main(int argc, char ** argv)
{

   char *s = "Ala ma kota";
   char p[100] = "Ala";
   char *q = " ma kota";
   char *pusty = "";


   drukuj_string(s); // wypisz za pomoca putchar


   printf(" \nDlugosc stringa: %d\n", dlugosc_stringa(s));
   dopisz_stringa(p, q);
   // drukuj_string(p);
   szukaj_w_stringu("Ala ma kota", "ma"); // zwroc 4



return 0;


}


0

Nadal porównujesz i<str[i]. Celowo wcześniej dałem w przykładzie długiego stringa, żeby pokazać, ze gdy indeks znaku w stringu jest większy od wartości znaku (w ASCII spacja to 32) to przestajesz wypisywać. Bo sprawdzasz czy np. 40 < ' '.

0
#include <stdio.h>
#include <string.h>


void drukuj_string(char *str)
{
   int i;
	for(i=0; 0 <str[i]; i++){

		{
		putchar(str[i]);
		}
	}
}

int dlugosc_stringa(char *str)
{
int i, j=0;
    for(i=0; 0<str[i]; i++)
	{
    j++;
	}
	return(j);


}
void dopisz_stringa(char *cel, char *dopisz_mnie)
{
int i,j;
	for(i=0; 0 <cel[i]; i++)
	{
		{
		putchar(cel[i]);
		}
	}
	for(j=0; 0 <dopisz_mnie[j]; j++)
	{
		{
		putchar(dopisz_mnie[j]);
		}
	}
}
void int_to_string(char *cel, int x)
{

}
int szukaj_w_stringu(char *szukaj_tutaj, char *szukaj_tego)
{

}
int main(int argc, char ** argv)
{

   char *s = "Ala ma kota";
   char p[100] = "Ala";
   char *q = " ma kota";
   char *pusty = "";


   drukuj_string(s); // wypisz za pomoca putchar


   printf(" \nDlugosc stringa: %d\n", dlugosc_stringa(s));
   dopisz_stringa(p, q);
   // drukuj_string(p);
   szukaj_w_stringu("Ala ma kota", "ma"); // zwroc 4



return 0;


}
0

Nietypowe porównanie, ale teraz wygląda dobrze, przynajmniej dla znaków z zakresu ASCII.

W dopisz_stringa miały być chyba inne parametry, nie?

0

ten cel_n to dla chętnych ;p mam 2h to wysłania tych funkcji i tak się śpieszę trochę ;p

0

Ok. Dopisz ma dopisać do cel string dopisz_mnie. Nie wypisać na ekran. Po wywołaniu tej funkcji w cel powinny być treści obu tych stringów.

0

Jak to mam dopisać? Nie mam pomysłu ;x

0

Przypisz znak po znaku.

0

Pomógłbyś przy 4 funkcji?

0

Pewnie, to nic trudnego. Najłatwiej liczbę zapisywać od tyłu. Pierw policz ile będzie miała cyfr, potem za pomocą operatorów reszty z dzielenia i dzielenia obliczaj kolejne cyfry.

0

nie rozumiem, mógłbyś napisac jakiś mały zalążek tego co ma być w funkcji?

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