2016-04-21 5 views
0

Hier ist mein Code:Wie wird eine Zeichenfolge in Groß-/Kleinbuchstaben strikt mit der Funktion fgets ausgedruckt?

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

int main() 
{ 
    FILE *fp; 
    char s[50]; 
    fp = fopen("line.txt" , "r"); 

    if(fgets (s, 50, fp)!=NULL) 
    { 
     puts(s); 
    } 
    fclose(fp); 

    return 0; 
} 

Ich weiß, wie in allen Groß- und Kleinbuchstaben mit der printf-Funktion eine Zeichenfolge anzuzeigen. Aber ich weiß nicht, wie man es mit der Fgets-Funktion macht. Ich lese auch eine Zeichenkette aus einer Datei, also ist das eine schwierige Sache für mich.

+1

Sie können mit 'fgets' keine Zeichenfolge in Großbuchstaben lesen oder schreiben.Sie können eine Zeichenfolge in einen Puffer lesen und dann die Zeichen im Puffer in Großbuchstaben usw. ändern. –

+0

Beachten Sie, dass Sie, wenn die Zeile kürzer als 49 Zeichen ist, zwei Zeilenfolgen ausgeben (eine aus der gelesenen Zeichenfolge) 'fgets()', eins hinzugefügt durch 'puts()'). Es wird wahrscheinlich nichts ausmachen, aber Sie sollten sich dessen bewusst sein. –

Antwort

1

strupr() Funktion (a non-standard function from Microsoft's C library) konvertiert alle Kleinbuchstaben in dieser Zeichenfolge in Großbuchstaben. Die Resultierende von strupr() wird in derselben Zeichenfolge gespeichert.

char str1[]="UppEr Case"; 
puts(strupr(str1)); //Converts to uppercase and displays it. 

oder

Sie können Ihre eigene Funktion schreiben.

int str_upr(char *cstr) 
{ 
    char *str=cstr; 
    for (;*str;str++) { 
     if (isalpha(*str)) 
      *str += 'A' - 'a'; 
    } 
    return 0; 
} 

Diese Implementierung wird Ihr Zeichenarray ändern.

Wenn Sie jedoch nur das Zeichenarray drucken möchten, ohne das ursprüngliche Array zu ändern, können Sie diese Implementierung verwenden.

void str_upr(char *str) 
{ 
    int c; 
    for (;*str;str++) { 
     c=*str; 
     if (isalpha(c)) 
      c += 'A'-'a'; 
     putc(c, stdout); 
    } 
} 
+1

'strupr()' ist keine Standard-C-Funktion. Seine Anwesenheit kann nicht verlassen werden. –

+0

Siehe [strupr() 'und' strlwr() 'in' '- sind sie Teil von Standard C?] (Https://stackoverflow.com/questions/26327812/strupr-and-strlwr-in-string- h-part-are-of-the-ansi-Standard) Wie die verknüpfte Frage feststellt, waren sie trotz der Behauptungen von Microsoft, dass sie Teil von POSIX sind, niemals ein Teil von POSIX - sie sind nur für Microsoft (und Microsoft bevorzugt) Sie schreiben ihre Namen mit einem führenden Unterstrich: '_strupr()' und '_strlwr()'). –

+0

Ich habe meine Antwort bearbeitet – abhiarora

3
if(fgets (s, 50, fp)!=NULL) 
{ 
    for(size_t ii = 0; s[ii]; ii++) 
    { 
     s[ii] = toupper((unsigned char)s[ii]); 
    } 
    puts(s); 
} 
+0

Technisch sollte es 'toupper ((unsigned char) s [ii])' sein, obwohl moderne C-Bibliotheken Ihre Verwendung erlauben, weil es so ein häufiger Fehler ist –

+0

@ M.M: Danke. Das ist verzögert, aber ich habe meine Antwort aktualisiert, um es zu reflektieren! –

1

Nach einer Zeichenkette (mit welchen Mitteln auch immer) zu lesen, zusätzlich zu der toupper Funktion in ctype.h, können Sie case-coversions von unteren bis oberen Fall (und von der oberen bis unteren machen) mit einfachen bitweisen Operationen.

Zeichenwerte

Sie werden oft den Begriff hören 7-bit ASCII. Dies liegt daran, dass der ASCII-Zeichensatz durch die ersten 7 Bits in jedem Zeichenwert dargestellt wird. (Das 8. Bit ist immer 0 für Standardzeichen.) Das 6. Bit ist das Fallbit. (für A-Za-z) Für A-Z ist das Fallbit0 und für a-z ist es 1.

char | dec | hex | binary 
-----+-------+--------+--------- 
    A | 65 | 0x41 | 01000001 
    B | 66 | 0x42 | 01000010 
    C | 67 | 0x43 | 01000011 
    D | 68 | 0x44 | 01000100 
    ... 
    a | 97 | 0x61 | 01100001 
    b | 98 | 0x62 | 01100010 
    c | 99 | 0x63 | 01100011 
    d | 100 | 0x64 | 01100100 

Um von Klein zu ändern-Groß-, alles, was erforderlich ist, prüft man sicher sein auf a-z und dann einfach Umlegen des 6.-Bit 1-0 arbeiten.

#include <stdio.h> 

enum { MAXC = 512 }; 

int main (void) { 

    char str[MAXC] = ""; 
    char *p = str; 

    printf ("\n enter str: "); 
    if (!fgets (str, MAXC, stdin)) { 
     fprintf (stderr, "error: invalid input.\n"); 
     return 1; 
    } 

    for (; *p; p++)     /* for each character */ 
     if ('a' <= *p && *p <= 'z') /* if lower-case  */ 
      *p ^= (1 << 5);   /* set case bit upper */ 

    printf (" uc-string: %s\n", str); 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/str2upper 

enter str: This is A String with UPPPER and lower case. 
uc-string: THIS IS A STRING WITH UPPPER AND LOWER CASE. 
:

In Ihrem Fall eine Zeichenfolge aus stdin zu lesen und dann alle Kleinbuchstaben in Großbuchstaben zu ändern, kann wie folgt durchgeführt werden

Schauen Sie vorbei und lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.

+0

Diese Antwort basiert auf dem ASCII-Zeichensatz, der verwendet wird –

+0

Das ist korrekt und in der Diskussion überhaupt nicht verborgen. –

Verwandte Themen