2016-10-10 2 views
2

Also im Grunde in dem Programm unter ich versuche, den Großbuchstaben eines Textes in Kleinbuchstaben und die Kleinbuchstaben in Großbuchstaben zu umwandeln und in einer Datei aus dem Ergebnis drucken ... aber das einzige, was ich nach dem Ausführen des Programms eine Folge von Zahlen ist ... ich habe versucht, als zweiten Parameter zu fprintf Funktion „% s“ zu setzen, aber ich habe nicht ein besseres Ergebnis bekommen ...in einer Datei c Schreiben

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

int main() 

{ 
    char c; 

    int charToLowerCase = 0; 
    int charToUpperCase = 0; 
    int countCharacters = 0; 
    FILE *in_file; 
    FILE *out_file; 
    in_file = fopen("input.txt", "r"); 
    out_file = fopen("output.txt", "w"); 
    c = fgetc(in_file); 
    while (c != EOF) 
    { 
     if (c >= 'A' && c <= 'Z') 
     { 
      fprintf(out_file, "%d", tolower(c)); 
      charToLowerCase++; 
     } 
     else if (c >= 'a' && c <= 'z') 
     { 
      fprintf(out_file, "%d", toupper(c)); 
      charToUpperCase++; 
     } 
     else 
      fprintf(out_file, "%d", c); 

     c = fgetc(in_file); 
     countCharacters++; 
    } 
    fclose(in_file); 
    fclose(out_file); 
    return 0; 
} 
+3

Beste 'int c 'zu verwenden, nicht' char c' in diesem Fall. Es ist die Art von 'fgetc() zurück', 'tolower()' und 'toupper()' und die ihre positiven Werte sind diejenigen, die von 'tolower erwartet()' und 'toupper()'. – chux

+1

Einverstanden. Und solange du dabei bist, [benutze auch 'isupper' und 'islower'] (http://pastebin.com/WM3mWeqH). Es gibt auch keinen Grund, den Vorschlaghammer zu benutzen, der 'fprintf' ist, wenn' fputc' ausreicht. – WhozCraig

+1

'wenn (c> = 'A' && c <= 'Z')' nicht tragbar ist. [Buchstaben sind nicht garantiert sequentiell] (https://en.wikipedia.org/wiki/EBCDIC). Pro ** 5.2.1 Zeichensätze ** des [C Standard] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf): * Die Werte der Mitglieder des Ausführungszeichensatzes sind implementierungsdefiniert. * Nur Ziffern sind garantiert sequentiell: * Sowohl in den grundlegenden als auch in den ausführenden Zeichensätzen ist der Wert jedes Zeichens nach '0' in der obigen Liste der Dezimalstellen Ziffern sind eins größer als der Wert des vorherigen. * –

Antwort

4

tolower und toupper Rückkehr ein int. (Dies ist so, dass sie mit EOF und anderen Kuriositäten umgehen können).

Sie sind fast sicher char zu werfen (streng sollten Sie die Größe des zurückgegebenen int überprüfen) und verwenden Sie einen geeigneten Formatierer, die für eine char, %c ist.

Beachten Sie auch, dass der C-Standard für Codierung ermöglicht Systeme, in denen die unteren und die Großbuchstaben nicht notwendigerweise in zusammenhängenden Blöcken sind. Siehe EBCDIC. Streng genommen ist if (c >= 'A' && c <= 'Z') keine C-Standard-konforme Testmethode, wenn ein Buchstabe groß geschrieben wird.

+0

Absolut! Deshalb war auch ich ärgerlich still. Eine portable Lösung ist ein Switch-Block mit den Zeichenliteralen als Case-Labels. – Bathsheba