C/C++ Programlamada metin içindeki harf ve rakamları ayırma

KOUsoftware

Hectopat
Katılım
1 Nisan 2020
Mesajlar
159
Yer
İstanbul
Daha fazla  
Cinsiyet
Erkek
Meslek
Öğrenci
Şu şekilde yazdırabiliyorum. Lakin direkt S değişkeninin içeriğine nasıl ayarlayabilirim?

C:
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void temizle (char *s){

    int  i,b=0,a=0;

    for( i=0;i<s[i]!='\0';i++){


        if( isdigit(s[i]) || isalpha(s[i]) ){

                s[i-b]=s[i]; a++;
        }

        else b++;
    }

    for(i=0;i<a;i++){
        printf("%c",s[i]);

        if( isdigit(s[i]) && isalpha(s[i+1]) || isalpha(s[i]) && isdigit(s[i+1]) )
            printf(" ");
    }


}

int main()
{
        char  str [128];
   

        printf("Sifrelenecek metni giriniz: ");
        fgets(str, sizeof(str), stdin);
 
        temizle(str);
   
    return 0;
}

Sayıları bir dizide toplamak için s değişkenindeki harf ve rakamların arasına ' ' koymak istiyorum. Yazdırabiliyorum ekrana lakin bellekte o şekilde tutulmasını nasıl sağlayabilirim? @Vavien.
 
Son düzenleme:
Etiketlendiğim için yazıyorum.
Daha önce size kod yazmıştım. Hala bu şekilde for döngüsü yazdığınız için yardım etmiyorum. Burada yazdığım iki kod var, benzerler, bir tane olarak nitelendirilebilir. Bu tarz, okunaklı bir şekilde paylaşırsanız göz atabilirim.
Oturup her iki satır arasına boşluk koymuyorum. Bir satırda 17 değişken tanımlanıyorum. Farklı satırlarda olması gereken kodları tek satıra tıkıştırmıyorum. Boşluk tuşunu kullanmamazlık yapmıyorum. Ve daha fazlası.
 
Kodu temiz bulmamışsınız anladığım -haksız da sayılmazsınız- bu konuya bundan sonra dikkat edeceğim inşallah. Yazdığım kodlarda başka yanlış bulduğunuz ya da tavsiye ettiğiniz bir şeyler varsa iletin lütfen.


C:
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void temizle (char *metin){

    int a=0; 
    int b=0;

    for(int i=0;i<metin[i]!='\0';i++){
        if( isdigit(metin[i]) || isalpha(metin[i]) ){
                metin[i-b]=metin[i];
                a++;
        }
        else b++;
    }

    for(int i=0;i<a;i++){
        printf("%c",metin[i]);
        if( isdigit(metin[i]) && isalpha(metin[i+1]) )
            printf(" ");
        else if ( isalpha(metin[i]) && isdigit(metin[i+1]) )
            printf(" ");
    }
}

int main()
{
        char  str [128];

        printf("Sifrelenecek metni giriniz: ");
        fgets(str, sizeof(str), stdin);
 
        temizle(str);
  
    return 0;
}
 
Başka tavsiye ettiğim şey var. Kod böyle olmalı. Seninkinde olmayan tonla boşluğu, girintileri ve diğer şeyleri fark etmişsindir umarım. Bu sadece attığının düzenli hali.
Tek satır koşul ve döngüler, pointer yıldız konumu ve artırma işlevi kabul edileblir.
Değişken isimleri kabul edilemez. a ve b diye değişken koyamazsın. Hem de kodun ne yapması gerektiğini söylemediğinde hiç koyamazsın.
Kod:
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void temizle(char* metin) {
    int a = 0;
    int b = 0;
 
    for (int i = 0; i < metin[i] != '\0'; ++i) {
        if (isdigit(metin[i]) || isalpha(metin[i]) ) {
            metin[i - b] = metin[i];
            ++a;
        }
        else {
            ++b;
        }
    }

    for (int i = 0; i < a; ++i) {
        printf("%c", metin[i]);

        if (isdigit(metin[i]) && isalpha(metin[i  +  1])) {
            printf(" ");
        }     
        else if (isalpha(metin[i]) && isdigit(metin[i + 1])) {
            printf(" ");
        }
    }
}

int main() {
    char str[128];

    printf("Sifrelenecek metni giriniz: ");
    fgets(str, sizeof(str), stdin);
 
    temizle(str);

    return 0;
}

Şifrelenecek metin tanımınızdan kendinizce bir şifreleme çalışması yaptığınızı anlayabiliyorum sadece. Bu kadar.
İlk kodunuzda s değişkeninin içeriği demişsiniz, yenisinde ismi metin olmuş. Okuduğunuz gibi yazabilirsiniz. const char* değil de char* olarak almışsınız.
String kütüphanesini eklemişsiniz. Fonksiyonları kullanmayı düşünmez misiniz? strcpy() ve strncpy() sizi bekler.

Koddan bu kadar anlıyorum. neOlduguBelliOlmayanDegisken (namıdiğer a) ve neOlduguBelliOlmayanDigerDegisken (namıdiğer b) ile bir şeyler yapmışsınız. Konuya uygun olmuş. Çok şifreli. Anlaşılmıyor.
 
Yapmak istediğim şifreleme biçimi şöyle: Girilen karakterlerden sadece sayı veya harfleri alıp sayıdan harfe veya harften sayıya geçtiğinde araya boşluk bırakmak. Ekrana yazdırabiliyorum lakin bellekte o şekilde tutmam gerek. Çünkü yazdırdıktan sonra sayıları bir dizide toplamalıyım.
a değişkeninin amacı şöyle:
Eğer karakter rakam veya sayı ise a artsın çünkü a'ya kadar bastıracağım metnin karakterlerini.
Null'a kadar bastırmayı deneyince farklı karakterleri de bastırıyor.
b değişkeni de sayı ve harf harici karakterlerin değişmesi için.
 
Bu arada şimdi fark ettim. Bu nedir?
i < metin[i] != '\0'

İstediğiniz bu yani.
Taşıma daha rahat olacağı için ve kesişen yerler olduğu için memmove() daha mantıklı. Yine de yedek string kullanıp önce oraya, sonra geri taşımak veya manuel olarak taşıyıcı fonksiyonu yazmak daha güvenli.


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

void temizle(char* metin) {
    size_t size = strlen(metin);
 
    for (int i = 0; metin[i + 1] != '\0'; ++i) {
        if (isdigit(metin[i]) && isalpha(metin[i + 1]) ||
            isalpha(metin[i]) && isdigit(metin[i + 1])) {
            memmove(metin + i + 2, metin + i + 1, size - i);
            metin[i + 1] = ' ';
        }
    }
}

int main() {
    char str[128];

    printf("Sifrelenecek metni giriniz: ");
    fgets(str, sizeof(str), stdin);
 
    temizle(str);
    
    printf("%s\n", str);

    return 0;
}
 
Bu arada şimdi fark ettim. Bu nedir?
i < metin[i] != '\0'

İstediğiniz bu yani.
Taşıma daha rahat olacağı için ve kesişen yerler olduğu için memmove() daha mantıklı. Yine de yedek string kullanıp önce oraya, sonra geri taşımak veya manuel olarak taşıyıcı fonksiyonu yazmak daha güvenli.


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

void temizle(char* metin) {
    size_t size = strlen(metin);
 
    for (int i = 0; metin[i + 1] != '\0'; ++i) {
        if (isdigit(metin[i]) && isalpha(metin[i + 1]) ||
            isalpha(metin[i]) && isdigit(metin[i + 1])) {
            memmove(metin + i + 2, metin + i + 1, size - i);
            metin[i + 1] = ' ';
        }
    }
}

int main() {
    char str[128];

    printf("Sifrelenecek metni giriniz: ");
    fgets(str, sizeof(str), stdin);
 
    temizle(str);
   
    printf("%s\n", str);

    return 0;
}
O döngüdeki i el alışkanlığından gözden kaçmış.
memmove fonkiyonunu bilmiyodum, öğrendim teşekkürler.
Aynı işlevi noktalama işaretleri yerine ' ' basacak şekilde yazdım lakin noktalama işaretlerini hiç bastırmaması lazım.

Örnek:
 

Dosya Ekleri

  • 1.png
    1.png
    16,9 KB · Görüntüleme: 28
Aynı işlevi noktalama işaretleri yerine ' ' basacak şekilde yazdım lakin noktalama işaretlerini hiç bastırmaması lazım.
Oradaki karakter boşluk herhalde. Girdiyi alırken terminalde mi görünmesin istiyorsunuz?
Değiştirdiğiniz kodu paylaşın.
 
Son düzenleme:
C:
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void temizle (char* metin){

    int b=0;
    int a=0;

    for(int i = 0; metin[i] != '\0'; ++i ){
        if( isdigit( metin[i] ) || isalpha( metin[i] ) ){
                metin[i - b] = metin[i];
                ++a;
        }
        else ++b;
    }
    for(int i = 0; i < a; ++i){
        printf("%c", metin[i]);
          if( isdigit( metin[i] ) && isalpha( metin[i + 1] ) ||
              isalpha( metin[i] ) && isdigit( metin[i + 1] ) )
              printf(" ");
    }
}

int main(){

        char  str [128];

        printf("Sifrelenecek metni giriniz: ");
        fgets(str, sizeof(str), stdin);

        temizle(str);

    return 0;
}

Bu şekilde ekrana bastırabiliyorum lakin sayıları bir diziye atmam gerektiğinden bellekte de bu şekilde tutulması gerkiyor onu beceremedim.
 
Girilen karakterlerden sadece sayı veya harfleri alıp sayıdan harfe veya harften sayıya geçtiğinde araya boşluk bırakmak.
Bunu dedin.
Kod:
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void temizle(char* metin) {
    size_t size = strlen(metin);
 
    for (int i = 0; metin[i + 1] != '\0'; ++i) {
        if (isdigit(metin[i]) && isalpha(metin[i + 1]) ||
            isalpha(metin[i]) && isdigit(metin[i + 1])) {
            memmove(metin + i + 2, metin + i + 1, size - i);
            metin[i + 1] = ' ';
        }
    }
}

int main() {
    char str[128];

    printf("Sifrelenecek metni giriniz: ");
    fgets(str, sizeof(str), stdin);
 
    temizle(str);
   
    printf("%s\n", str);

    return 0;
}
Bunu attım.

Hala gelmiş printf kullanıyorsun. Dipdibe yazıyorsun. a ve b diye şeyler kullanıyorsun.

Ben niye uğraşıyorum ki? Sen uğraş dur. Kolay gelsin.
 

Technopat Haberler

Geri
Yukarı