我正在努力实现一个函数,它可以将字母转换为字母,反之亦然。
我不明白的是,当我在主程序中使用代码时,它可以工作,当我试图把它放在一个函数中时,它不工作,我不明白。
#include <stdio.h>
#include <ctype.h>
char sentence[100];
int count, ch, i;
void KUlowerL(char *sentence)
{
printf("%s", sentence); // Test if I get char from sentence. it works ?!?!
for (i=0;(sentence[i] = getchar()) != '\n'; i++); /* enters the user sentence to change the case */
sentence[i] = '\0';
count = i;
printf("Der Satz ist: %s", sentence);
printf("\nDer veränderte Satz ist: ");
for (i = 0; i < count; i++)
{
ch = islower(sentence[i]) ? toupper(sentence[i]) : tolower(sentence[i]);
putchar(ch);
}
}
int main()
{
printf("Bitte gebe deinen Satz ein: ");
fgets(sentence, 100, stdin);
KUlowerL(sentence);
}
字符串
5条答案
按热度按时间sczxawaw1#
我注意到以下情况:
字符串
.然后我注意到你正在传递给
KUlowerL
,那么getchar
循环是什么?你已经用fgets
代码做过了,是吗?关于
getchar
和tolower
,这两者在某种程度上是fgets
无法联系在一起的.你需要将char
的值转换为unsigned char
,然后传递给tolower
,在那里它们将被提升为int
,而getchar
返回你已经为你转换的角色,因此,如果将返回值保持为**int
**形式,则不需要强制转换。mf98qq942#
对于初学者来说,使用这样的全局变量是一个坏主意
字符串
没有必要将它们定义为全局的。
该函数已经通过其参数获得了一个字符串。因此使用
getchar
调用重写它没有意义。型
此外,该函数不会更改已处理的字符串。
可以通过以下方式声明和定义函数
型
在main中,函数可以这样调用:
型
oxf4rvwz3#
你不需要这个
?
运算符。该函数将改变字母的大小写,忽略非字母。字符串
下面这条线毫无意义
型
你只需要在字符串中遍历
型
编辑:
换箱子
型
https://godbolt.org/z/WdcKh5TfK
vxqlmq5t4#
它看起来不起作用的原因是使用
getchar()
的循环,你不希望输入句子ZWEI MAL!你按回车键,什么也看不到,因为第二个“句子”是零个字符长.我检查了你的代码做了些修改...
字符串
输出量:
型
uelo1irk5#
实现一个函数,该函数将把小写字母转换为小写字母,反之亦然。
完善案例交换功能
'\n'
结尾。最好创建一个函数来处理一个 string 并在一个 *null字符 * 处停止,而不是'\n'
KUlowerL()
中删除用户I/O代码。让调用代码读取数据并打印文本。OP试图读取两行输入(一行在main()
中,一行在KUlowerL()
中)会引起麻烦。它可以解释“当我在main中使用代码时,它可以工作,当我试图将其放入函数时,它不工作”。is...(int ch)
和to...(int ch)
对于值[0...UCHAR_MAX]
和EOF
是明确定义的,否则如果ch < 0
,结果是 undefined behavior(UB)。str...()
函数的执行方式就像通过unsigned char *
访问 * 字符串 * 一样,即使char
是 * 签名的 *。这种情况下转换代码也应该执行同样的操作。KUlowerL()
是一个容易混淆的名称,用于交换大小写的函数。字符串
测试代码
型