我无法识别错误。代替a
,必须打印A
,但打印其他一些字母。在其他字母的情况下也是如此。请帮助找出错误。
#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{
char m[20];
int i;
printf("Enter any string:");
gets(m);
for(i=0;i<=strlen(m);i++)
{
if(m[i]>=97&&m[i]<=122)
m[i]=m[i]-26;
else
m[i]=m[i]+26;
}
printf("%s\n",m);
return 0;
}
答案 0 :(得分:4)
按以下方式更改循环
for(i=0; i < strlen(m); i++ )
^^^
否则你会覆盖终止零。
而不是魔术数字97和122,最好使用字母'A'和'Z'。 例如
if ( m[i] >= 'A' && m[i] <= 'Z' )
这似乎也是这句话
m[i]=m[i]-26;
错了
我认为你的意思是以下
if ( m[i] >= 'A' && m[i] <= 'Z' )
m[i] = m[i] + 'a' - 'A' ;
else if ( m[i] >= 'a' && m[i] <= 'z' )
m[i] = m[i] - 'a' + 'A' ;
考虑在标题isupper
中声明的标准函数islower
和toupper
以及相应的tolower
和<ctype.h>
C标准不再支持函数gets
,因为它不安全。我建议改为使用fgets
。
答案 1 :(得分:1)
该值为32而不是26。
if(m[i]>=97&&m[i]<=122)
m[i]=m[i]-32;
else
m[i]=m[i]+32;
最好用于检查isupper
和islower
。然后按tolower
和toupper
进行更改。那你就不必考虑ASCII值了。
if(isupper(m[i]))
{
m[i]=tolower(m[i]);
}
else
{
m[i]=toupper(m[i]);
}
答案 2 :(得分:0)
您将大写字母转换为小写字母是错误的.ascii差异为32
而非26
。
此外,您应该运行循环直到strlen(m)-1
,因为字符是从零索引存储的。
for(i=0;i<strlen(m);i++)
{
if(m[i]>=97&&m[i]<=122)
m[i]=m[i]-32;//changing lower case to upper requires subtraction of 32
else
m[i]=m[i]+32;
}
答案 3 :(得分:0)
只需将26更改为32,因为在大写字母和小写字符之间,您还有其他一些ascii值,如[\] ^ _ ...
这是ascii table,供您自行检查
编辑:此外,当您修复此问题时,您可能希望更改终止条件(如果不这样做,则可能会出现OutOfBounds异常)到i<strlen(m)
,因为您正在处理零基于系统(i,e以0
开头,以strlen(m)-1
结尾,vs。以1
开头,以strlen(m)
结尾。