【问题标题】:How to print out a string in uppercase/lowercase letters strictly using the fgets function?如何严格使用 fgets 函数以大写/小写字母打印字符串?
【发布时间】:2016-04-21 02:50:28
【问题描述】:

这是我的代码:

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

【问题讨论】:

  • 您不能使用fgets 读取或写入全部大写的字符串。您可以将字符串读入缓冲区,然后将缓冲区中的字符操作为全部大写等。
  • 请注意,如果该行少于 49 个字符,您将得到两个换行符输出(一个来自fgets() 读取的字符串,一个来自puts() 添加的字符串)。这可能无关紧要,但你应该意识到这一点。

标签: c string fgets


【解决方案1】:
if( fgets (s, 50, fp)!=NULL ) 
{
   for( size_t ii = 0; s[ii]; ii++ )
   {
      s[ii] = toupper((unsigned char)s[ii]);
   }
   puts(s);
}

【讨论】:

  • 技术上应该是toupper( (unsigned char)s[ii] ),尽管现代 C 库允许您使用,因为这是一个常见的错误
  • @MM:谢谢。这有点迟钝,但我更新了我的答案以反映它!
【解决方案2】:

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

字符值

您会经常听到7-bit ASCII这个术语。这是因为 ASCII 字符集由每个字符值的前 7 位表示。 (对于标准字符,第 8 位始终是 0。)第 6 位是 case-bit。 (对于A-Za-z)对于A-Zcase-bit0,对于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.

查看一下,如果您有任何问题,请告诉我。

【讨论】:

  • 这个答案依赖于正在使用的 ASCII 字符集
  • 说得对,完全没有隐藏在讨论中。
【解决方案3】:

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

【讨论】:

  • strupr() 不是标准的 C 函数。不能依赖它的存在。
  • 参见strupr() and strlwr() in &lt;string.h&gt; — are they part of Standard C? 正如链接的问题所指出的那样,尽管微软声称它们是 POSIX 的一部分,但它们从未成为 POSIX 的一部分——它们仅适用于微软(微软更喜欢你用前导下划线写出他们的名字:_strupr()_strlwr())。
猜你喜欢
  • 2020-01-04
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2020-02-15
  • 2014-12-21
  • 1970-01-01
  • 2019-08-08
相关资源
最近更新 更多