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

Funkcja ktora zmienia ciag znaków

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
143 wizyt
pytanie zadane 4 maja 2019 w C i C++ przez DobryKurczak Bywalec (2,320 p.)

Witam.

Chcę zrobić funkcję, która dowolny podany ciąg znaków wypisuje wypisuje w taki sposób, że każda litera tego napisu pojawi się dwa razy, czyli przykładowo:

dane wejsciowe funkcji: programowanie

dane wyjsciowe funkcji: pprrooggrraammoowwaanniiee

Oto co zrobiłem:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void echo(char* s) {
	char* p;
	int len = 0;

	while (s[len++]);
	len -= 2;

	for (int i = 0, j=0;i < len;i++) {
		p[j] = s[i];
		j++;
		p[j] = s[i];
		j++;
	}

	printf("%s", p);
}

 void main() {

	 char napis[100];
	 printf("Podaj dowolny ciag znakow");
	 scanf("%s", &napis);
	 echo(&napis);

 }

Błąd mi pokazuje w linijce:

	p[j] = s[i];

komunikat o błędzie mówi mi, że zmienna lokalna p nie jest zainicjowana. A przecież na samym początku dałem zmienna char* p a potem wykorzystuję ją w pętli. Czy tak nie można w C zrobić? Jeśli nie można, to jak to poprawić? Z góry dziękuję za pomoc! :)

1 odpowiedź

0 głosów
odpowiedź 4 maja 2019 przez RafalS VIP (122,820 p.)
wybrane 5 maja 2019 przez DobryKurczak
 
Najlepsza

p nie jest zainicjowana. A przecież na samym początku dałem zmienna char* p a potem wykorzystuję ją w pętli

Inicjalizacja to co innego niż deklaracja. Ty zmienną zdeklarowałeś:

char *p;

Inicjalizacja to np:

char *p = NULL;

Kompilator krzyczy, bo po deklaracji wskaźnika p wskazuje on w jakieś losowe miejsce. Nie ma tam żadnej tablicy.

Żeby zrobić to dobrze musiałbyś poczytać o dynamicznej alokacji w przypadku C funkcje: malloc, calloc, realloc i free.

Ale na szybko możesz po prostu stworzyć zwykłą tablicę 2 razy większą niż ta w mainie:

char p[200];

A tak na marginesie jeśli chodzi o samo wypisanie tego ciągu to nie musisz tworzyć nowego stringa, możesz wypisywać na bieżąco:

void echo(char* s) {
	for (int i = 0; s[i] != NULL; i++) {
		printf("%c%c", s[i], s[i]);
	}
}

A co do mierzenia długości stringa:

	while (s[len++]);
	len -= 2;

to w string.h jest od tego funkcja:

int len = strlen(s);

 

Podobne pytania

0 głosów
3 odpowiedzi 834 wizyt
0 głosów
3 odpowiedzi 376 wizyt
pytanie zadane 9 czerwca 2019 w C i C++ przez Aleksandra01 Użytkownik (530 p.)
0 głosów
2 odpowiedzi 279 wizyt

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 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

...