如何使用fgets函数严格打印大写/小写字母的字符串?

时间:2016-04-21 02:50:28

标签: c string 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功能来做到这一点。我也正在从文件中读取一个字符串,这对我来说很棘手。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

字符值

您经常会听到 7位ASCII 这个词。这是由于ASCII字符集由每个字符值的前7位表示。 (对于标准字符,第8位始终为0。)第6位是 case-bit 。 (适用于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上操作然后只是翻转从10的第6位。

在您的情况下,从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.

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

答案 2 :(得分:0)

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