C dilinde negatif değer elde eden kelime sayacı

Bu kelime sayacını geliştirmeye çalışıyorum (hat ve char sayaçlarıyla birlikte). Kurallar, her şeyin boşluklar, sekmeler, yeni çizgiler, noktalı virgüller ve kısa çizgilerle ayrılan her şey dışında bir kelime olmasıdır. Örneğin:  'xyz' 'git; aşağı' 'hey..howareyou' hepsi 1 kelime ve 'hey: sen' tacos-burrito 'her 2 kelime vardır.

Benim yaklaşımım şudur:

#include 
#include 

int main(){

    int charHolder, result, wordCount, lineCount = 0;

    int recursiveSeparatorCheck(charOther){
        if(isspace(charOther)||charOther=='\t'||charOther=='\n' || charOther ==':' || charOther == '-')
            return 1;
        return 0; 
    }


    while ((charHolder = getchar()) != EOF){
        if(charHolder == '\n')
            lineCount++;
        result++;
        if(recursiveSeparatorCheck(charHolder) == 1)
            continue;
        wordCount++;


    }


    printf("Number of char: %d \n", result);
    printf("Number of lines: %d \n", lineCount);
    printf("Number of words: %d \n", wordCount);
    return (EXIT_SUCCESS);
}

Programımı çalıştırdığımda ve 20 satır ve 160 kelime içeren bir dosyayı okumak için beslediğimde, aşağıdakileri yazdırır:

Number of char: 1130 
Number of lines: 20 
Number of words: -4195164 

Neyi yanlış yaptığımı bilen var mı? Yardımınız için teşekkürler!

0
Tüm değişkenleri başlatmayı unuttun, ancak lineCount . Programınızı Valgrind üzerinden çalıştırmak, bu tür hataları bulmanıza yardımcı olabilir. Ayrıca #include 'a ihtiyacınız var. Son olarak int recursiveSeparatorCheck (charOther) int recursiveSeparatorCheck (int charOther) olmalıdır.
katma yazar 5gon12eder, kaynak
Tüm değişkenleri başlatmayı unuttun, ancak lineCount . Programınızı Valgrind üzerinden çalıştırmak, bu tür hataları bulmanıza yardımcı olabilir. Ayrıca #include 'a ihtiyacınız var. Son olarak int recursiveSeparatorCheck (charOther) int recursiveSeparatorCheck (int charOther) olmalıdır.
katma yazar 5gon12eder, kaynak
Kod satır başına sadece bir değişken bildirimi listelemişse, bu sorun asla gerçekleşmeyecekti. Bu, 'sadece belirli bir kod sırasının yazılabilmesi/uyulması gerektiğinden, kullanılması gerektiği anlamına gelmez. Ayrıca tüm yerel değişkenlerin beyanda neden ilklendirilmesi gerektiğine dair en iyi örneklerden biri.
katma yazar user3629249, kaynak
Kod satır başına sadece bir değişken bildirimi listelemişse, bu sorun asla gerçekleşmeyecekti. Bu, 'sadece belirli bir kod sırasının yazılabilmesi/uyulması gerektiğinden, kullanılması gerektiği anlamına gelmez. Ayrıca tüm yerel değişkenlerin beyanda neden ilklendirilmesi gerektiğine dair en iyi örneklerden biri.
katma yazar user3629249, kaynak
Kod satır başına sadece bir değişken bildirimi listelemişse, bu sorun asla gerçekleşmeyecekti. Bu, 'sadece belirli bir kod sırasının yazılabilmesi/uyulması gerektiğinden, kullanılması gerektiği anlamına gelmez. Ayrıca tüm yerel değişkenlerin beyanda neden ilklendirilmesi gerektiğine dair en iyi örneklerden biri.
katma yazar user3629249, kaynak
Sadece bir not, ancak strchr ("\ t \ n: -", charOther)! = NULL ile tüm uzun if cümlesini değiştirebilirsiniz.
katma yazar Tom Hunt, kaynak
Sadece bir not, ancak strchr ("\ t \ n: -", charOther)! = NULL ile tüm uzun if cümlesini değiştirebilirsiniz.
katma yazar Tom Hunt, kaynak
Sadece bir not, ancak strchr ("\ t \ n: -", charOther)! = NULL ile tüm uzun if cümlesini değiştirebilirsiniz.
katma yazar Tom Hunt, kaynak

7 cevap

Bu satırın dört değişkenin tümünü 0 olarak başlattığı izlenimi altındasınız.

int charHolder, result, wordCount, lineCount = 0;

Olmaz. Yalnızca lineCount başlatılır, diğerlerinin tanımsız değerleri vardır. Bunları başlatmak için wordCount ve sonuç 'dan sonra = 0 ekleyin.

3
katma

Bu satırın dört değişkenin tümünü 0 olarak başlattığı izlenimi altındasınız.

int charHolder, result, wordCount, lineCount = 0;

Olmaz. Yalnızca lineCount başlatılır, diğerlerinin tanımsız değerleri vardır. Bunları başlatmak için wordCount ve sonuç 'dan sonra = 0 ekleyin.

3
katma

wordCount is uninitialized, an it contains indeterminate value, you need to explicitly initialize it to 0, as well as all other variables

int charHolder, result, wordCount, lineCount = 0;

sadece lineCount başlıyor, bunun gibi bir şeye ihtiyacınız var.

int charHolder, result, wordCount, lineCount;
charHolder = result = wordCount = lineCount = 0;

hiç sevmediğim, ama demek istediğin buydu.

Note: You really need to use compiler warnings.

2
katma

wordCount is uninitialized, an it contains indeterminate value, you need to explicitly initialize it to 0, as well as all other variables

int charHolder, result, wordCount, lineCount = 0;

sadece lineCount başlıyor, bunun gibi bir şeye ihtiyacınız var.

int charHolder, result, wordCount, lineCount;
charHolder = result = wordCount = lineCount = 0;

hiç sevmediğim, ama demek istediğin buydu.

Note: You really need to use compiler warnings.

2
katma

Bunu denemelisin:

int charHolder = 0, result = 0, wordCount = 0, lineCount = 0;
1
katma

Bunu denemelisin:

int charHolder = 0, result = 0, wordCount = 0, lineCount = 0;
1
katma

Bunu denemelisin:

int charHolder = 0, result = 0, wordCount = 0, lineCount = 0;
1
katma