我正在尝试创建一个函数,该函数将识别第一个字母输入是大写还是小写,然后以相同的大小写(大写/小写)输出其余字符串。

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

我对fgets不熟悉。运行它后,我可以输入并按Enter键,该程序无法运行。我没有收到任何编译器错误。我相信我在void shift函数上出错了。

另外,我知道不建议使用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;
}

最佳答案

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

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

#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()的检查。 (请参阅他对缓冲区大小的评论。)

关于c - 识别大写/小写字母C的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34938138/

10-15 06:57