''C character too large for enclosing character literal type'' hatası

Tr0llZilla

Hectopat
Katılım
15 Aralık 2020
Mesajlar
27
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
#include <stdio.h> #include <ctype.h> #include <string.h> int main() { char metin[1000]; char arananHarf; int sesliHarfSayisi = 0, kelimeSayisi = 0, girilenHarfSayisi = 0, harfSayisi = 0; printf("Metni girin: "); fgets(metin, sizeof(metin), stdin); printf("Aranan harfi girin: "); scanf(" %c", &arananHarf); // Metindeki kelime sayısını hesaplamak için strtok kullandım. char *kelime = strtok(metin, " "); while (kelime != NULL) { kelimeSayisi++; kelime = strtok(NULL, " "); } for (int i = 0; metin[i] != '\0'; i++) { if (isalpha(metin[i])) { girilenHarfSayisi++; char ch = tolower(metin[i]); //Sesli harfleri kontrol ediyor. if (ch == 'a' || ch == 'e' || ch == 'ı' || ch == 'i' || ch == 'o' || ch == 'ö' || ch == 'u' || CH == 'ü') { sesliHarfSayisi++; } // Aranan harfi kullanılacının girdiği harfle karşılaştırıyor. if (tolower(metin[i]) == tolower(arananHarf)) { harfSayisi++; } } } printf("Sesli harf sayısı: %d\n", sesliHarfSayisi); printf("Kelime sayısı: %d\n", kelimeSayisi); printf("Girilen harf sayısı: %d\n", girilenHarfSayisi); printf("'%c' harfi metin içinde %d kez geçiyor.\n", arananHarf, harfSayisi); return 0; }

Yukarıdaki kodda sesli harfleri kontrol ediyor yorum satırının altındaki if kodunun içindeki Türkçe karakterler varken program çalışmıyor. Türkçe karakterler varken kodu nasıl çalıştırabilirim?
 
#include <stdio.h> #include <ctype.h> #include <string.h> int main() { char metin[1000]; char arananHarf; int sesliHarfSayisi = 0, kelimeSayisi = 0, girilenHarfSayisi = 0, harfSayisi = 0; printf("Metni girin: "); fgets(metin, sizeof(metin), stdin); printf("Aranan harfi girin: "); scanf(" %c", &arananHarf); // Metindeki kelime sayısını hesaplamak için strtok kullandım. char *kelime = strtok(metin, " "); while (kelime != NULL) { kelimeSayisi++; kelime = strtok(NULL, " "); } for (int i = 0; metin[i] != '\0'; i++) { if (isalpha(metin[i])) { girilenHarfSayisi++; char ch = tolower(metin[i]); //Sesli harfleri kontrol ediyor. if (ch == 'a' || ch == 'e' || ch == 'ı' || ch == 'i' || ch == 'o' || ch == 'ö' || ch == 'u' || CH == 'ü') { sesliHarfSayisi++; } // Aranan harfi kullanılacının girdiği harfle karşılaştırıyor. if (tolower(metin[i]) == tolower(arananHarf)) { harfSayisi++; } } } printf("Sesli harf sayısı: %d\n", sesliHarfSayisi); printf("Kelime sayısı: %d\n", kelimeSayisi); printf("Girilen harf sayısı: %d\n", girilenHarfSayisi); printf("'%c' harfi metin içinde %d kez geçiyor.\n", arananHarf, harfSayisi); return 0; }

Yukarıdaki kodda sesli harfleri kontrol ediyor yorum satırının altındaki if kodunun içindeki Türkçe karakterler varken program çalışmıyor. Türkçe karakterler varken kodu nasıl çalıştırabilirim?

Hocam yapay zeka ile mi yazdınız kodu? Wchar_t deneyebilirsiniz.
#include <stdio.h> #include <ctype.h> #include <string.h> int main() { wchar_t metin[1000]; wchar_t arananHarf; int sesliHarfSayisi = 0, kelimeSayisi = 0, girilenHarfSayisi = 0, harfSayisi = 0; printf("Metni girin: "); fgetws(metin, sizeof(metin), stdin); printf("Aranan harfi girin: "); wscanf(L" %c", &arananHarf); // Metindeki kelime sayısını hesaplamak için strtok kullandım. wchar_t *kelime = wcstok(metin, L" "); while (kelime != NULL) { kelimeSayisi++; kelime = wcstok(NULL, L" "); } for (int i = 0; metin[i] != L'\0'; i++) { if (iswalpha(metin[i])) { girilenHarfSayisi++; //Sesli harfleri kontrol ediyor. wchar_t ch = towlower(metin[i]); if (ch == L'a' || ch == L'e' || ch == L'ı' || ch == L'i' || ch == L'o' || ch == L'ö' || ch == L'u' || ch == L'ü') { sesliHarfSayisi++; } // Aranan harfi kullanılacının girdiği harfle karşılaştırıyor. if (towlower(metin[i]) == towlower(arananHarf)) { harfSayisi++; } } } printf("Sesli harf sayısı: %d\n", sesliHarfSayisi); printf("Kelime sayısı: %d\n", kelimeSayisi); printf("Girilen harf sayısı: %d\n", girilenHarfSayisi); printf("'%c' harfi metin içinde %d kez geçiyor.\n", arananHarf, harfSayisi); return 0; }
 
Kıyaslama için char yerine int kullan. Çözülür sorunun. 1 bytelık bir değişken olan ch en fazla 256 karakteri temsil edebilir. (2^8) Eğer VSCode ve CLangd eklentisini kullanırsan "ı", "ö" ve diğer türkçe karakterlerin 256'lık limitin dışında olduğunu görürsün. Örneğin 'ı' 305. karakter. (L Wide char type'ı temsil ediyor.) Ek olarak wchar_t tercih edebilirsin ancak yine bu durumda L prefixini eklemen lazım kıyasa yoksa hata alacaksın.
1704485947013.png

C:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main() {
    char metin[1000];
    char arananHarf;
    int sesliHarfSayisi = 0, kelimeSayisi = 0, girilenHarfSayisi = 0, harfSayisi = 0;
    printf("Metni girin: ");
    fgets(metin, sizeof(metin), stdin);
    printf("Aranan harfi girin: ");
    scanf(" %c", &arananHarf);
    // Metindeki kelime sayısını hesaplamak için strtok kullandım.
    char *kelime = strtok(metin, " ");

    while (kelime != NULL) {
        kelimeSayisi++;
        kelime = strtok(NULL, " ");
    }

    for (int i = 0; metin[i] != '\0'; i++) {
        if (isalpha(metin[i])) {
            girilenHarfSayisi++;
            unsigned int ch = tolower(metin[i]);

            //Sesli harfleri kontrol ediyor.
            if (ch == 'a' || ch == 'e' || ch == L'ı' || ch == 'i' || ch == 'o' || ch == L'ö' || ch == 'u' || ch == L'ü') {
                sesliHarfSayisi++;
            }

            // Aranan harfi kullanılacının girdiği harfle karşılaştırıyor.
            if (tolower(metin[i]) == tolower(arananHarf)) {
                harfSayisi++;
            }
        }
    }

    printf("Sesli harf sayısı: %d\n", sesliHarfSayisi);
    printf("Kelime sayısı: %d\n", kelimeSayisi);
    printf("Girilen harf sayısı: %d\n", girilenHarfSayisi);
    printf("'%c' harfi metin içinde %d kez geçiyor.\n", arananHarf, harfSayisi);
    
    return 0;
}
 
Kıyaslama için char yerine int kullan. Çözülür sorunun. 1 bytelık bir değişken olan ch en fazla 256 karakteri temsil edebilir. (2^8) Eğer VSCode ve CLangd eklentisini kullanırsan "ı", "ö" ve diğer türkçe karakterlerin 256'lık limitin dışında olduğunu görürsün. Örneğin 'ı' 305. karakter. (L Wide char type'ı temsil ediyor.) Ek olarak wchar_t tercih edebilirsin ancak yine bu durumda L prefixini eklemen lazım kıyasa yoksa hata alacaksın.
Eki Görüntüle 2075481
C:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main() {
    char metin[1000];
    char arananHarf;
    int sesliHarfSayisi = 0, kelimeSayisi = 0, girilenHarfSayisi = 0, harfSayisi = 0;
    printf("Metni girin: ");
    fgets(metin, sizeof(metin), stdin);
    printf("Aranan harfi girin: ");
    scanf(" %c", &arananHarf);
    // Metindeki kelime sayısını hesaplamak için strtok kullandım.
    char *kelime = strtok(metin, " ");

    while (kelime != NULL) {
        kelimeSayisi++;
        kelime = strtok(NULL, " ");
    }

    for (int i = 0; metin[i] != '\0'; i++) {
        if (isalpha(metin[i])) {
            girilenHarfSayisi++;
            unsigned int ch = tolower(metin[i]);

            //Sesli harfleri kontrol ediyor.
            if (ch == 'a' || ch == 'e' || ch == L'ı' || ch == 'i' || ch == 'o' || ch == L'ö' || ch == 'u' || ch == L'ü') {
                sesliHarfSayisi++;
            }

            // Aranan harfi kullanılacının girdiği harfle karşılaştırıyor.
            if (tolower(metin[i]) == tolower(arananHarf)) {
                harfSayisi++;
            }
        }
    }

    printf("Sesli harf sayısı: %d\n", sesliHarfSayisi);
    printf("Kelime sayısı: %d\n", kelimeSayisi);
    printf("Girilen harf sayısı: %d\n", girilenHarfSayisi);
    printf("'%c' harfi metin içinde %d kez geçiyor.\n", arananHarf, harfSayisi);
   
    return 0;
}
Teşekkürler problem çözüldü.

Hocam yapay zeka ile mi yazdınız kodu? Wchar_t deneyebilirsiniz.
#include <stdio.h> #include <ctype.h> #include <string.h> int main() { wchar_t metin[1000]; wchar_t arananHarf; int sesliHarfSayisi = 0, kelimeSayisi = 0, girilenHarfSayisi = 0, harfSayisi = 0; printf("Metni girin: "); fgetws(metin, sizeof(metin), stdin); printf("Aranan harfi girin: "); wscanf(L" %c", &arananHarf); // Metindeki kelime sayısını hesaplamak için strtok kullandım. wchar_t *kelime = wcstok(metin, L" "); while (kelime != NULL) { kelimeSayisi++; kelime = wcstok(NULL, L" "); } for (int i = 0; metin[i] != L'\0'; i++) { if (iswalpha(metin[i])) { girilenHarfSayisi++; //Sesli harfleri kontrol ediyor. wchar_t ch = towlower(metin[i]); if (ch == L'a' || ch == L'e' || ch == L'ı' || ch == L'i' || ch == L'o' || ch == L'ö' || ch == L'u' || ch == L'ü') { sesliHarfSayisi++; } // Aranan harfi kullanılacının girdiği harfle karşılaştırıyor. if (towlower(metin[i]) == towlower(arananHarf)) { harfSayisi++; } } } printf("Sesli harf sayısı: %d\n", sesliHarfSayisi); printf("Kelime sayısı: %d\n", kelimeSayisi); printf("Girilen harf sayısı: %d\n", girilenHarfSayisi); printf("'%c' harfi metin içinde %d kez geçiyor.\n", arananHarf, harfSayisi); return 0; }
Teşekkürler problem çözüldü. Yapay zeka ile yazdım ama nasıl anladınız?
 

Geri
Yukarı