Char döndüren fonksiyonum hata veriyor

Kod

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

char cakmainput(char text[60]) {
	printf(text);
	char data[40];
	scanf("%s", data);
	return data;
}

int main() {
	char a = cakmainput("Enter:");
	printf("%c", a);
}


Hata:

17:55:27 **** Incremental Build of configuration Debug for project baslangic ****
Info: Internal Builder is used for build
gcc -O0 -g3 -Wall -c -fmessage-length=0 -o denee.o "..\\denee.c" 
..\denee.c: 'cakmainput' işlevinde:
..\denee.c:8:9: UYARI: returning 'char *' from a function with return type 'char' makes integer from pointer without a cast [-Wint-conversion]
  return data;
         ^~~~
..\denee.c:8:9: UYARI: işlev yerel değişkenin adresi ile dönüyor [-Wreturn-local-addr]
gcc -o baslangic.exe denee.o sayi.o 

17:55:28 Build Failed. 2 errors, 0 warnings. (took 928ms)



Amacım python’da bulunan input fonksiyonunu yazmaktı. Yardımlarınızı bekliyorum.

Bu kodun istediğiniz gibi çalışması lazım:

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

char* cakmainput(char* text) {
	puts(text);
	char* data = malloc (sizeof(char) * 40);
	scanf("%39s", data);
	return data;
}

int main() {
	char* a = cakmainput("Enter:");
	puts(a);
	free(a);
}

Kodunuzdaki hatalar:

  • Dönüş tipi olarak char pointeri seçmelisiniz.
  • Fonksiyonunuzun içinde oluşturduğunuz data değişkenini geri döndürmeye çalışıyorsunuz ama fonksiyon bittiğinde data değişkeni otomatik olarak silinir, çünkü stackde tanımlanıyor. Bu yüzden malloc kullanmanız lazım. Böyle bir şeye ihtiyacımız kalmasın diye de scanf fonksiyonu sonucu yazacağı değişkeni argüman olarak alır zaten.
1 Beğeni

char ile char[] farkli turler. char tek bir karakteri temsil ediyor. Bu fonksiyonun bu haliyle tek bir karakter dondurmesi lazim, 'x' veya 'y' gibi.

text'e boyut verilmesinin hic bir manasi yok, char text[] de olabilirdi. Kafa karistirmamasi acisindan char *text tercih ediyoruz. (Boyutu hic bir zaman bilinmedigi icin array’den cok pointer’a benziyor.)

Bu kullanim hatali. Dogrusu printf("%s", text) veya puts(text).

Dizi/dize scan ederken boyut belirtmek lazim (%39s). Su an 39 karakterden fazla girildigi anda buffer overflow oluyor.

main fonksiyonunun aldigi parametreleri belirtmekte fayda var: void veya int argc, char *argv[].

main fonksiyonu int donduruyor. 0 veya EXIT_SUCCESS mesela.

malloc NULL dondurebilir, kontrol etmek lazim.
sizeof(char) her zaman 1, ama arada ben de kullaniyorum. Bu durumda sizeof(*data) derdim.
Memory leak var; malloc'a karsilik free lazim.

Yukarida yazdigim. ("%s", text veya puts.)


ve evet, bu yuzden sevmiyoruz C’yi :slight_smile:

3 Beğeni