2016-04-21 42 views
0

這裏是我的代碼:如何嚴格使用fgets函數以大寫/小寫字母打印字符串?

#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; 
} 

我知道如何顯示在使用printf函數所有大寫和小寫字母的字符串。但我不知道如何使用fgets函數來做到這一點。我正在從一個文件中讀取一個字符串,這對我來說是一件棘手的事情。

+1

您無法使用'fgets'以全部大寫字母讀取或寫入字符串。您可以將字符串讀入緩衝區,然後將緩衝區中的字符操作爲全部大寫字母等。 –

+0

請注意,如果行少於49個字符,則會得到兩個換行符輸出(一個來自讀取的字符串'fgets()','puts()'添加的)。這可能無關緊要,但你應該意識到這一點。 –

回答

1

strupr()函數(a non-standard function from Microsoft's C library)將該字符串中的所有小寫字符轉換爲大寫字符。來自strupr()的結果存儲在同一個字符串中。

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

您可以編寫自己的函數。

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

該實現將修改您的字符數組。

但是,如果您只是想在不修改原始數組的情況下打印字符數組,則可以使用此實現。

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

'strupr()'不是一個標準的C函數。它的存在不能被依賴。 –

+0

請參閱''在''中的''strupr()'和'strlwr()' - 它們是標準C的一部分嗎?](https://stackoverflow.com/questions/26327812/strupr-and-strlwr-in-string- h-part-of-the-ansi-standard)正如鏈接問題所指出的那樣,儘管微軟聲稱他們是POSIX的一部分,但他們從未成爲POSIX的一部分 - 他們只對微軟(而微軟更喜歡你用一個前導下劃線來寫他們的名字:'_strupr()'和'_strlwr()')。 –

+0

我編輯了我的答案 – 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

從技術上講,它應該是'toupper((unsigned char)s [ii])',儘管現代C庫允許你使用,因爲這是一個常見的錯誤 –

+0

@ M.M:謝謝。這是遲緩的,但我更新了我的答案,以反映它! –

1

ctype.h讀一個字符串(通過任何手段),除了toupper功能後,可以從低到大寫做出區分coversions(從上部到下部)與簡單的按位操作。

字符值

你會經常聽到這個詞7位ASCII。這是由於ASCII字符集由每個字符值中的前7位表示。 (對於標準字符,第8位總是0)。第6位是的情況位。 (對於A-Za-z)對於A-Z的情況位0並且對於a-z它是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 

小寫改變大寫,所有需要的是檢查,以確保您正在運行a-z,然後簡單地翻轉第6位從10

在你的情況,讀取來自stdin字符串,然後改變任何小寫字符爲大寫可以做如下:

#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; 
} 

實施例使用/輸出

$ ./bin/str2upper 

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

仔細查看,如果您有任何問題,請告訴我。

+0

這個答案依賴於正在使用的ASCII字符集 –

+0

這是正確的,在討論中完全沒有隱藏。 –

相關問題