我正在尝试创建一个函数,该函数将识别输入的第一个字母是大写还是小写,然后以相同的大小写(大写/小写)输出字符串的其余部分。
例如,"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
环形。添加了对 fgets()
的返回值的检查正如@JonathanLeffler 所建议的那样。 (请参阅他关于缓冲区大小的评论。)
关于c - 识别大写/小写字母C的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34938138/