我正在尝试创建一个函数来识别第一个字母输入是大写还是小写,然后在相同的情况下(上/下)输出字符串的其余部分 .
例如, "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 回答
你不需要拨打
fgets()
五十次 . 它从stdin
读取一行并将其写入my_string
. 看起来你只想读一行,而不是五十(而只保留最后一行) . 50是将被读取和写入缓冲区的最大字符数(减1) . 此限制是为了防止缓冲区溢出 . 见fgets() .尝试在
fgets()
调用之前删除该行上的for
循环 . 此外,您不需要main()
中的my_string
. 更正后的代码:编辑:添加
ch
初始化,由@thurizas指出 . 将while
循环更改为for
循环 . 根据@JonathanLeffler的建议,添加了检查以返回fgets()
的值 . (参见他对缓冲区大小的评论 . )所有ASCII字符均由7位表示 . (因此术语为7位ASCII)小写和大写之间唯一的按位差异是bit-5(第六位)设置为小写,而clear(unset)设置为大写 . 这允许在小写和大写之间进行简单的按位转换(通过添加/减去
32
或直接简单地翻转bit-5 . )如果第一个字符是大写的话,这允许简单的测试和转换:
Example Use