将大写字母更改为小写字母时的错误答案,反之亦然

时间:2015-07-03 19:02:19

标签: c loops if-statement

我无法识别错误。代替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;
}

4 个答案:

答案 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中声明的标准函数islowertoupper以及相应的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;

最好用于检查isupperislower。然后按tolowertoupper进行更改。那你就不必考虑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)结尾。