如何严格使用 fgets 函数打印出 uppercase/lowercase 个字母的字符串?

How to print out a string in uppercase/lowercase letters strictly using the fgets function?

这是我的代码:

#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 函数来完成。我也在从文件中读取字符串,所以这对我来说很棘手。

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);
    }
}
if( fgets (s, 50, fp)!=NULL ) 
{
   for( size_t ii = 0; s[ii]; ii++ )
   {
      s[ii] = toupper((unsigned char)s[ii]);
   }
   puts(s);
}

读取字符串后(通过任何方式),除了 ctype.h 中的 toupper 函数外,您还可以进行从小写到大写(以及从大写到to-lower) 通过简单的按位运算。

字符值

您会经常听到术语 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 位从 1 翻转到 0.

在您的例子中,从 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;
}

例子Use/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.

仔细阅读,如果您有任何问题,请告诉我。