2015-11-15 2 views
-2

Мне нужно скрывать этот код от пользовательского ввода, используя gets() для сканирования во входном txt-файле. Было бы также полезно найти способ подсчета количества букв в каждом слове. Начиная с 1 букв и слов.Изменение ввода() на вход txt-файла

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 


int main(void) { 

    int acount, bcount, ccount, dcount, ecount, fcount, gcount, hcount, icount, jcount, kcount, lcount, mcount, ncount, ocount, pcount, qcount, rcount, scount, tcount, ucount, vcount, wcount, xcount, ycount, zcount = 0; 
    char *str; 

    printf("Enter any string : "); 
    gets(str); 

    while (*str != '\0') 
    { 
     if(isalpha(*str)) 
      { 
       toupper(*str); 
       switch(*str) 
       { 
         case 'A': 
         ++acount; 
         break; 

         case 'B': 
         ++bcount; 
         break; 

         case 'C': 
         ++ccount; 
         break; 

         case 'D': 
         ++dcount; 
         break; 

         case 'E': 
         ++ecount; 
         break; 

         case 'F': 
         ++fcount; 
         break; 

         case 'G': 
         ++gcount; 
         break; 

         case 'H': 
         ++hcount; 
         break; 

         case 'I': 
         ++icount; 
         break; 

         case 'J': 
         ++jcount; 
         break; 

         case 'K': 
         ++kcount; 
         break; 

         case 'L': 
         ++lcount; 
         break; 

         case 'M': 
         ++mcount; 
         break; 

         case 'N': 
         ++ncount; 
         break; 

         case 'O': 
         ++ocount; 
         break; 

         case 'P': 
         ++pcount; 
         break; 

         case 'Q': 
         ++qcount; 
         break; 

         case 'R': 
         ++rcount; 
         break; 

         case 'S': 
         ++scount; 
         break; 

         case 'T': 
         ++tcount; 
         break; 

         case 'U': 
         ++ucount; 
         break; 

         case 'V': 
         ++vcount; 
         break; 

         case 'W': 
         ++wcount; 
         break; 

         case 'X': 
         ++xcount; 
         break; 

         case 'Y': 
         ++ycount; 
         break; 

         case 'Z': 
         ++zcount; 
         break; 

       }//Close case 
      }//Close if 
    }//Close while 

    printf("Number of A's: %d", acount); 

} 
+0

Не используйте получает http://stackoverflow.com/questions/30890696/why-gets-is-revrecated –

+0

Вы не выделили память на str. get требует, чтобы вы выделили некоторую память и надеетесь, что пользователь не наберет слишком много букв. –

ответ

3

Многие ошибки в коде

  1. Вы не инициализировать все переменные (x)count0, прочитать об операторе комы.

  2. Вы использовали gets(), который является средней и устаревшей функцией.

  3. Вы передали неинициализированный указатель gets(), который является неопределенным поведением.

  4. toupper(*str) не изменяет *str.

Попробуйте это один

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int main(void) 
{ 
    /* You need an array of int's with size equal to the number of letters 
    * int the alphabet 
    */ 
    int count['Z' - 'A' + 1]; 
    /* You need some space to store the text, `str' will become a poitner 
    * when you pass it to `fgets()' pointing to an array of 1000 `chars' 
    */ 
    char str[1000]; 
    /* Initialize all the counters to 0 */ 
    for (int i = 0 ; i < sizeof(count)/sizeof(*count) ; ++i) 
     count[i] = 0; 
    printf("Enter any string : "); 
    /* Read the string, use `fgets()` and prevent a buffer overflow */ 
    if (fgets(str, sizeof(str), stdin) == NULL) 
     return -1; 
    /* Now count the letters */ 
    for (int i = 0 ; ((str[i] != '\0') && (str[i] != '\n')) ; ++i) 
    { 
     /* If it's not a letter, go to the next one */ 
     if (isalpha((int) str[i]) == 0) 
      continue; 
     /* It's a letter, count it at the correct position */ 
     count[toupper((int) str[i]) - 'A'] += 1; 
    } 

    /* Print the count of each letter, skipping those that did not appear */ 
    for (int i = 0 ; i < sizeof(count)/sizeof(*count) ; ++i) 
    { 
     if (count[i] == 0) 
      continue; 
     fprintf(stderr, "Number of %c's : %d\n", i + 'A', count[i]); 
    } 
    return 0; 
} 
+1

Ничего себе, ты быстро. Возможно, вы захотите отметить, что получение устарело, поскольку в основном это гарантирует, что пользователь может вызвать переполнение буфера в вашей программе. –

+0

'((str [i]! = '\ N') && (str [i]! = '\ N'))' является избыточным и вызывает UB, если последняя строка файла не заканчивается линией перевода строки. Просто используйте 'str [i]! = '\ 0'', так как вы все равно считаете буквы. 'isalpha (str [i])' должно быть 'isalpha ((unsigned char) str [i])' для учета глупых систем, где 'char' подписан. По той же причине вы должны написать 'count [toupper ((unsigned char) str [i]) - 'A'] + = 1;'. Также имейте в виду, что 'isalpha' может быть истинным для символов, отличных от ASCII, и' toupper' может возвращать значения, превышающие '' Z'' в некоторых локалях. – chqrlie

+0

@chqrlie Конечно! И 'isalpha()' ожидает 'int' не' unsigned char'. –

0

Все замечания в ответ iharob являются правильными. Прочтите мой комментарий о его ответе на дополнительные проблемы. Вот простое решение:

#include <stdio.h> 

int main(void) { 
    int counts[256] = { 0 }; 
    int c; 

    printf("Enter any string: "); 
    while ((c = getchar()) != EOF && c != '\n') { 
     counts[c & 255]++; 
    } 
    printf("Number of A's: %d", counts['a'] + counts['A']); 
    return 0; 
} 

EDIT: здесь есть решение для обработки файла вместо строки ввода:

#include <stdio.h> 

int main(int argc, char **argv) { 
    long long int counts[256] = { 0 }; 
    int c; 
    FILE *f; 

    if (argc < 2) { 
     fprintf(stderr, "usage: %s FILE\n", argv[0]); 
     exit(2); 
    } 
    if ((f = fopen(argv[1], "r")) == NULL) { 
     fprintf(stderr, "%s: cannot open %s\n", argv[0], argv[1]); 
     exit(1); 
    } 
    while ((c = getc(f)) != EOF) { 
     counts[c & 255]++; 
    } 
    fclose(f); 
    printf("Number of A's: %lld", counts['a'] + counts['A']); 
    return 0; 
} 
+0

Как редактировать эту программу, чтобы она сканировала файл для текста, а не для ввода пользователем? –

+0

Вы можете просто удалить тест для '' \ n'' и использовать перенаправление командной строки для чтения файла через стандартный ввод: 'myprogram chqrlie

+0

Не могли бы вы объяснить больше? Я смущен –

Смежные вопросы