C Kodum neden böyle çıktı veriyor?

metinsama

Kilopat
Katılım
7 Aralık 2014
Mesajlar
810
Çözümler
5
Arkadaşlar, ben bir diziden harf silen C kodu yaptım ama ilginç bir şekilde kodda oynayarak böyle bir çıktı elde ettim, bu tam olarak neden oluyor?
C:
#include <stdio.h>
#include <string.h>
void main(){
    char *p1,text[100],harf;
    printf("Kelime giriniz : ");
    gets(text);
    printf("Silmek istediginiz harfi giriniz : ");
    scanf("%c",&harf);
    for(p1=text;*p1;p1++){
        if(*p1==harf){
            strcpy(text+1,text);
        }
    }
    printf("Harf silindikten sonra cumle : %s",text);
}

Arkadaşlar çözüm aramıyorum zaten sorunlu kod "strcpy(text+1,text);" olduğunu biliyorum ama neden böyle bir çıktı çıktı onu merak ediyorum.

Bash:
C:\Users\XXXX\Documents\C-C++>a.exe
Kelime giriniz : metin
Silmek istediginiz harfi giriniz : m
Harf silindikten sonra cumle : mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmeetidd╚vnnÃvnnÃv^^╦^↕↕@↕@@↓@■■a aa a╠╠Ãv//f(      aoÃÃv↓@@ a→→@↓@@@%♥■a
 
Arkadaşlar, ben bir diziden harf silen C kodu yaptım ama ilginç bir şekilde kodda oynayarak böyle bir çıktı elde ettim, bu tam olarak neden oluyor?
C:
#include <stdio.h>
#include <string.h>
void main(){
    char *p1,text[100],harf;
    printf("Kelime giriniz : ");
    gets(text);
    printf("Silmek istediginiz harfi giriniz : ");
    scanf("%c",&harf);
    for(p1=text;*p1;p1++){
        if(*p1==harf){
            strcpy(text+1,text);
        }
    }
    printf("Harf silindikten sonra cumle : %s",text);
}

Arkadaşlar çözüm aramıyorum zaten sorunlu kod "strcpy(text+1,text);" olduğunu biliyorum ama neden böyle bir çıktı çıktı onu merak ediyorum.

Bash:
C:\Users\XXXX\Documents\C-C++>a.exe
Kelime giriniz : metin
Silmek istediginiz harfi giriniz : m
Harf silindikten sonra cumle : mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmeetidd╚vnnÃvnnÃv^^╦^↕↕@↕@@↓@■■a aa a╠╠Ãv//f(      aoÃÃv↓@@ a→→@↓@@@%♥■a
Burda text arrayı 100 karakterlik bir boyutta tanımlandığı için büyük ihtimalle arrayın bitişini sağlayan karakterde bir hata olmuş.
 
String sonunda \0 yok o yüzden herhalde.
Makarna kod yazmayın.

text'i hiçbir zaman artırmıyorsunuz ki. Sürekli aynı konuma bir şeyler yazmaya çalışıyorsunuz.
For döngünüzde ortada sadece *p1 var. Bu false döndürecek bir şey nasıl olacak?
Neden strcpy kullandığınızı tam anlamadım. Onunla bu işlemin yapılabileceğinden de pek emin değilim. İyice karışı gibi geliyor.
Sizin kodunuzu olabildiğince koruyarak bu hale getirebildim.

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

int main() {

    char* p1;
    char text[100];
    char harf;
    char newText[100];

    printf("Kelime giriniz: ");
    gets(text);
    char end = text[strlen(text)];

    printf("Silmek istediginiz harfi giriniz: ");
    scanf("%c", &harf);

    int i = 0;
    for (p1 = text; *p1 != end; ++p1) {
        if (*p1 != harf) {
            newText[i] = *p1;
            ++i;
        }
    }
    
    printf("Harf silindikten sonra cumle: %s", newText);

    return 0;
}
 
String sonunda \0 yok o yüzden herhalde.
Makarna kod yazmayın.

Text'i hiçbir zaman artırmıyorsunuz ki. Sürekli aynı konuma bir şeyler yazmaya çalışıyorsunuz.
For döngünüzde ortada sadece *p1 var. Bu false döndürecek bir şey nasıl olacak?
Neden strcpy kullandığınızı tam anlamadım. Onunla bu işlemin yapılabileceğinden de pek emin değilim. İyice karışı gibi geliyor.
Sizin kodunuzu olabildiğince koruyarak bu hale getirebildim.

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

int main() {

char* p1;
char text[100];
char harf;
char newText[100];

printf("Kelime giriniz: ");
gets(text);
char end = text[strlen(text)];

printf("Silmek istediginiz harfi giriniz: ");
scanf("%c", &harf);

int i = 0;
for (p1 = text; *p1 != end; ++p1) {
if (*p1 != harf) {
newText = *p1;
++i;
}
}

printf("Harf silindikten sonra cumle: %s", newText);

return 0;
}

Sadece *p1 var çünkü "\0" olunca sıfır değeri döndürüyor boşuna neden eşittir end veya başka bir şeye eşitleyeyim? Kodumun düzgün çalışması "strcpy(p1, p1+1);" yapsam yeterli oluyor başka bir diziye ihtiyaç kalmıyor siz makarna kod yazıyorsunuz herhalde. Yukarıda belirtiğim kod neden değişik karakter bastığını merak ediyorum sadece.
 
Çünkü diziyi taşıyorsunuz.
Şimdi belleğimizde 100 Byte'lık yer olduğunu düşünelim. İlk 4 Byte'a "abcd" yazdık ve c harfinin silinmesini istedik. Kodunuzdaki strcpy(text+1, text); gidiyor diziyi alıyor ve kendisinin ikinci karakterinden sonrasına koymaya çalışıyor. Bu durumda abcd ifademiz aabcdd oluyor. Bence hata tamamen aynı yere atmaya çalışmanızla alakalı. Bir sonrakine yazmaya çalışıyorsunuz. Kopyalamayı ise sırayla yapmıyor gibi görünüyor. Sırayla yapsa sonsuz sayıda a içeren abcd ifadesi dönerdi.
strcpy(text+1, text); yerine strcpy(text, text+1); yazdığınızda sağa kaydırmak yerine sola kaydırıyorsunuz. Bu durumda abcd ifadesi bcd ifadesine dönüşür.

Strcpy kullanmakta ısrarcı iseniz ilk döründüğü yeri tespit edip öncesini ve sonrasını 2 kere olacak şekilde ayırmanızı tavsiye ederim. Strcpy stringin tamamını kopyalıyor.

Ya da şöyle de yapabilirsiniz. Yapmak istediğinize daha uygun sanırım.

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

int main(){
    char *p1;
    char text[100];
    char harf;

    printf("Kelime giriniz: ");
    gets(text);

    printf("Silmek istediginiz harfi giriniz: ");
    scanf("%c", &harf);
    
    for(p1 = text; *p1; ++p1){
        if(*p1 == harf){
            strcpy(p1, p1 + 1);
        }
    }

    printf("Harf silindikten sonra cumle: %s", text);

    return 0;
}
 

Yeni konular

Geri
Yukarı