2017-02-19 3 views
1

Я создаю программу, которая преобразует все буквы в словах (173528 из текстового файла) из строчных букв в верхний регистр.Заглавные слова из текстового файла

Вот функция:

void CapitalizeDictionary(char *Words[]) { 
    int i = 0; 

    while (Words[i] != '\0') { 
     Words[i] = Words[i] - 32; 
    } 
    i++; 
} 

Есть инициализация, печать и освободив функции. Вот моя основная функция:

int main() { 
    char *Words[NWORDS]; 

    Initialize(Words); 

    Cap(Words); //lowercase to uppercase 

    Print(Words);  
    Free(Words);  

    return 0; 
} 

Я попытался изменить его несколько раз, но это не сработает.

+3

'в то время как (Слова [я] = '\ 0') {Слова [I] = Слова [я] - 32;': тип 'Слова [я]' это 'символ *'. – BLUEPIXY

+0

Используйте [toupper] (https://www.tutorialspoint.com/c_standard_library/c_function_toupper.htm) –

+1

Вы увеличиваете цикл 'i' _outside_. – emlai

ответ

7
  1. Words[i] является char*, не char, но вы сравниваете его '\0'.
  2. i не изменяется внутри цикла.
  3. Вы только итерации массива верхнего уровня, а не строки в этом массиве.

Предполагая, что Words массив и строки в ней являются завершающим нулем, следующее должно работать:

#include <ctype.h> 

void CapitalizeDictionary(char *Words[]) 
{ 
    for (int i = 0; Words[i] != NULL; i++) 
     for (int j = 0; Words[i][j] != '\0'; j++) 
     Words[i][j] = toupper((unsigned char)Words[i][j]); 
} 
+0

Ive разместил i внутри цикла. Есть ли способ изменить его без использования toupper? – Erail

+1

Да, если все буквы строчные, вы можете использовать 'Words [i] [j] - = 32;'. Я не могу придумать никаких причин, чтобы избежать «toupper». – emlai

+1

'toupper' лучше - он также будет работать с числами, прописными буквами и т. Д. Это безопаснее. –

0

быстрый способ, если оптимизатор не уже делают это для вас, :

 for (char *p = Words[i]; *p; p++) 
     if (*p>='a' && *p<='z') 
      *p -= 32; 
Смежные вопросы