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

metinsama

Hectopat
Katılım
7 Aralık 2014
Mesajlar
241
Çözümler
1
Beğeniler
166
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
 

berat158

Hectopat
Katılım
29 Ağustos 2016
Mesajlar
35
Beğeniler
3
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ş.
 

Vavien.

Exapat
Katılım
20 Aralık 2014
Mesajlar
8.625
Çözümler
109
Beğeniler
11.351
Yer
İstanbul
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;
}
 
KS
metinsama

metinsama

Hectopat
Katılım
7 Aralık 2014
Mesajlar
241
Çözümler
1
Beğeniler
166
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.
 

Vavien.

Exapat
Katılım
20 Aralık 2014
Mesajlar
8.625
Çözümler
109
Beğeniler
11.351
Yer
İstanbul
Çü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;
}
 

permatik

Millipat
Katılım
7 Ocak 2020
Mesajlar
773
Çözümler
1
Beğeniler
354
Dizi elemanlarının içeriğini değiştirebilirsiniz ama dizi elemanının kendisini silemezsiniz.
Burada C için bir anlatım var : C Programlama
 
Son düzenleme:
KS
metinsama

metinsama

Hectopat
Katılım
7 Aralık 2014
Mesajlar
241
Çözümler
1
Beğeniler
166
Dizi elemanlarının içeriğini değiştirebilirsiniz ama dizi elemanının kendisini silemezsiniz.
Burada C için bir anlatım var : C Programlama
Zaten silmiyorum ben strcopy ile istediğim harfe gelince o harften bir sonraki dizi elemanını harf olarak atıyorum böylece silinmiş olarak görünüyor.
 



Yeni konular

Yukarı