例如,如果您的文件包含以下文字:CompuTEr
。然后在运行代码后,文件的内容应为:cOMPUteR
!
但问题只是一个字符。它没有变成Captial A.
#include<stdio.h>
#include<conio.h>
#include <ctype.h>
int main()
{
char name[100];
int loop;
printf("Enter any Sting: ");
gets(name);
for (loop=0; name[loop] !=0; loop++)
{
if(name[loop]>='A' && name[loop]<='Z')
name[loop]=name[loop]+32;
else if(name[loop]>'a' && name[loop]<='z')
name[loop]=name[loop]-32;
}
printf("\nConvert case of character : %s",name);
return 0;
}
答案 0 :(得分:3)
更改
else if(name[loop]>'a' && name [loop]<='z')
要
else if(name[loop]>='a' && name [loop]<='z')
Never ever use gets()
. It is dangerous因为它不会阻止buffer overflows。请改用fgets()
:
fgets(name,sizeof(name),stdin);
答案 1 :(得分:1)
您的代码存在许多问题:
#include<stdio.h>
使用适当的间距:#include <stdio.h>
。
虽然不需要大多数间距,但是空格和缩进的一致使用极大地增强了代码的可读性并减少了错误的数量。如果你使用草率风格,你可能也使用错误的算法和粗心的结构。错误将有更多隐藏的地方。 C是一个非常敏锐的工具,它对粗心大意是不可原谅的。
#include<conio.h>
这个标题是一个过时的,微软特定的东西。这里不需要。
#include <ctype.h>
ctype.h
为您的作业定义了正确的功能,但您甚至无法使用它们!
int main()
将main
定义为int main(void)
或int main(int argc, char *argv[])
{
char name[100];
int loop;
printf("Enter any Sting: ");
所以整件事只是一个刺痛?有趣的lapsus!
gets(name);
绝对从不曾使用gets
!如果用户在提示符下键入超过99个字符,gets
将导致缓冲区溢出,因为它无法确定name
的大小。此缓冲区溢出很可能导致程序崩溃,但仔细利用此类漏洞可能允许攻击者控制计算机。这是一个非常好的简单的安全漏洞示例。在大多数情况下,scanf
在这种情况下更复杂,效率更低且难以安全使用。只需使用fgets
并正确处理尾随'\n'
。
for (loop=0; name[loop] !=0; loop++)
此循环的常用习惯用法是使用名为i
的索引变量。将其loop
命名为令人困惑和冗长。与0
的比较可以更简单地编写,因为name[loop]
是您的老师认可的,或name[loop] == '\0'
以明确您正在比较字符。
{
if(name[loop]>='A' && name[loop]<='Z')
您应该使用isupper
来测试大写字母。明确地与字符值'A'
和'Z'
进行比较是不可移植且容易出错的,因为您似乎无法正确比较。
name[loop]=name[loop]+32;
您正在假设ASCII或类似编码。这种肮脏的技巧是不可移植的,令人困惑且容易出错。只需使用tolower
功能。
else if(name[loop]>'a' && name[loop]<='z')
与上述相同。你的代码有问题。正确使用间距和较简洁的索引名称应该使bug更明显:
else if (name[i] > 'a' && name[i] <= 'z')
使用islower
兼具便携性和可靠性。
name[loop]=name[loop]-32;
见上文。 toupper
就是为此而设计的。
}
printf("\nConvert case of character : %s",name);
修复破碎的英语。还要在格式字符串的末尾添加'\n'
。如果你不这样做,有些系统甚至不输出任何东西。
return 0;
}
在线学习作业只有从中学习才有用。我希望你做到了!