2017-02-19 3 views
1

Ich erstelle ein Programm, das alle Buchstaben in den Wörtern (173528 aus einer Textdatei) von Kleinbuchstaben in Großbuchstaben konvertiert.Großschreibung von Wörtern aus einer Textdatei

Hier ist die Funktion:

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

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

Es gibt Initialisierung, Druck und befreit Funktionen. Hier ist meine Hauptfunktion:

Ich habe versucht, es mehrmals zu ändern, aber es wird nicht funktionieren.

+3

'while (Worte [i] = '\ 0'!) {Worte [i] = Worte [i] - 32;': Art der 'Worte [i]' ist 'char *'. – BLUEPIXY

+0

Verwenden Sie [toupper] (https://www.tutorialspoint.com/c_standard_library/c_function_toupper.htm) –

+1

Sie erhöhen 'i' _outside_ the loop. – emlai

Antwort

7
  1. Words[i] ist ein char*, kein char, aber du bist es zu '\0' vergleichen.
  2. i ändert sich nicht innerhalb der Schleife.
  3. Sie iterieren nur das oberste Array, nicht die Strings in diesem Array.

Unter der Annahme, dass die Words Array und die Saiten in ihm sind nullterminierten, sollten folgende Arbeiten:

#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 platziert ich innerhalb der Schleife. Gibt es eine Möglichkeit, es ohne den Einsatz von toupper zu ändern? – Erail

+1

Ja, wenn alle Buchstaben Kleinbuchstaben sind, können Sie 'Words [i] [j] - = 32;' verwenden. Ich kann mir keinen Grund vorstellen, 'toupper' zu vermeiden. – emlai

+1

'toupper' ist besser - es funktioniert auch mit Zahlen, Großbuchstaben usw. Es ist sicherer. –

0

Eine schnelle Art und Weise, wenn der Optimierer nicht bereits dies für Sie tun haben, ist :

 for (char *p = Words[i]; *p; p++) 
     if (*p>='a' && *p<='z') 
      *p -= 32; 
Verwandte Themen