首页 文章

用于识别大写/小写字母C的功能

提问于
浏览
2

我正在尝试创建一个函数来识别第一个字母输入是大写还是小写,然后在相同的情况下(上/下)输出字符串的其余部分 .

例如, "Hi there" 将变为 "HI THERE" .

我不熟悉 fgets . 一旦我运行它,我可以输入并按回车键,程序没有得到任何编译器错误 . 我相信我在虚空移位功能上出错了 .

另外,我知道 gets 不推荐,是 fgets 相似吗?或者使用 scanf 更好吗?

#include <stdio.h>
#include <ctype.h>
void shift (char *my_string); // Function declaration

int main()
{
  char inputstring[50];

  printf("Enter a string\n");
  char *my_string = inputstring;
  shift(my_string); // Function
}

void shift (char *my_string) // Function definition
{
  int i =0;
  char ch;

  for(i=0; i<50; i++)
    fgets(my_string, 50, stdin);

  while(my_string[i])
  {
    if(ch>='A' && ch<= 'Z') // When first char is uppercase
    {
      putchar (toupper(my_string[i]));
      i++;
    }
    else if (ch>='a' && ch <= 'z') // When first char is lowercase
    {
      putchar(tolower(my_string[i]));
      i++
    }
  }
  return;
}

3 回答

  • 0

    你不需要拨打 fgets() 五十次 . 它从 stdin 读取一行并将其写入 my_string . 看起来你只想读一行,而不是五十(而只保留最后一行) . 50是将被读取和写入缓冲区的最大字符数(减1) . 此限制是为了防止缓冲区溢出 . 见fgets() .

    尝试在 fgets() 调用之前删除该行上的 for 循环 . 此外,您不需要 main() 中的 my_string . 更正后的代码:

    #include <stdio.h>
    #include <ctype.h>
    void shift (char *my_string);//function declaration
    
    int main()
    {
      char inputstring[50];
    
      printf("Enter a string\n");
      shift(inputstring);
    }
    
    void shift (char *my_string) //function definition
    {
      int i;
      char ch;
    
      if ( fgets(my_string, 50, stdin) == NULL )
        return;
    
      ch = my_string[0];
      for ( i=0; my_string[i]; i++ )
      {
        if(ch>='A' && ch<= 'Z') //when first char is uppercase
        {
            putchar (toupper(my_string[i]));
        }
        else if (ch>='a' && ch <= 'z')//when first char is lowercase
        {
            putchar(tolower(my_string[i]));
        }
      }
      return;
    }
    

    编辑:添加 ch 初始化,由@thurizas指出 . 将 while 循环更改为 for 循环 . 根据@JonathanLeffler的建议,添加了检查以返回 fgets() 的值 . (参见他对缓冲区大小的评论 . )

  • 1
    • 这是您问题的另一种解决方案,
    #include <stdio.h>
    #include <ctype.h>
    void convertTo (char *string);
    
    int main()
    {
       char inputString[50];
    
       printf("Enter a string\n");
       convertTo(inputString);
    }
    
    void convertTo (char *string)
    {
       int i;
       char ch;
    
       gets(string);
    
       ch = string[0];
       for ( i=0; string[i]; i++ )
       {
          if(ch>='A' && ch<= 'Z')
          {
             if(string[i]>='a' && string[i]<= 'z')
                string[i] = string[i] - 32;
          }
          else if (ch>='a' && ch <= 'z')
          {
             if(string[i]>='A' && string[i]<= 'Z')
                string[i] = string[i] + 32;
          }
       }
       printf("%s\n", string);
       return;
    }
    
  • 6

    所有ASCII字符均由7位表示 . (因此术语为7位ASCII)小写和大写之间唯一的按位差异是bit-5(第六位)设置为小写,而clear(unset)设置为大写 . 这允许在小写和大写之间进行简单的按位转换(通过添加/减去 32 或直接简单地翻转bit-5 . )

    +-- lowercase bit
          |
    a = 01100001    A = 01000001
    b = 01100010    B = 01000010
    c = 01100011    C = 01000011
    ...
    

    如果第一个字符是大写的话,这允许简单的测试和转换:

    #include <stdio.h>
    
    enum { MAXC = 50 };
    
    char *shift (char *my_string);
    
    int main (void)
    {
        char inputstring[MAXC] = {0};;
    
        printf ("\n Enter a string: ");
        if (shift (inputstring))
            printf (" my_string is  : %s\n", inputstring);
    
        return 0;
    }
    
    char *shift (char *my_string)
    {
        char *p;
    
        if (!(p = fgets (my_string, MAXC, stdin))) return NULL;
    
        if (*p == '\n') return NULL;   /* Enter only pressed  */
    
        if ('A' <= *p && *p <= 'Z')    /* test for upper case */
            for (; *p; p++)            /* convert lower/upper */
                if ('a' <= *p && *p <= 'z') *p &= ~(1 << 5);
    
        return my_string;
    }
    

    Example Use

    $ ./bin/case_1st_to_upper
    
     Enter a string: this is my string
     my_string is  : this is my string
    
    $ ./bin/case_1st_to_upper
    
     Enter a string: This is my string
     my_string is  : THIS IS MY STRING
    

相关问题