我正在尝试创建一个函数,该函数将识别第一个字母输入是大写还是小写,然后以相同的大小写(大写/小写)输出其余字符串。
例如,"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/