Islower功能故障

时间:2012-11-12 04:30:29

标签: c function lowercase caesar-cipher cs50

我正在做CS50x课程而且我遇到了一个小问题。我问他们发生了什么,没有人知道发生了什么。

每当我尝试打印小写字母f时,它总会出现?尝试将23作为参数,并将abcdefghijklmnopqrstuvwxyz作为输入。它搞砸了。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>

int main (int argc, string argv[]){
  if(argc !=2){
    return 1;
  }

  string x = GetString();
  int key = atoi(argv[1]);

  for(int a = 0, n = strlen(x); a < n; a++){
    char i = key + x[a];

    if(islower(x[a])){
      if(i > 122){
        i = (i-122) + 96;
      }
    }
    if(isupper(x[a])){
      if(i > 90){
          i = (i-90) + 64;
      }
    }
    printf("%c", i);
  }

  printf("\n");
  return 0;
}

1 个答案:

答案 0 :(得分:3)

我怀疑是因为char i默认为signed。当您将23添加到小写字母时,任何高于104(正在127-23)的内容都会变成负数。查看您的代码,它将保持负面,因为它未通过后续测试,并且不会被修改。

通常最好使用char进行int算术运算,然后转换回char ...但您可以使用unsigned char解决此问题。