2012-11-12 6 views
-1

CS50x 클래스를하고 있고 결함이 있습니다. 나는 그들에게 무슨 일이 일어나고 있는지 그리고 아무도 무슨 일이 일어나고 있는지 알지 못했습니다.Islower function glitch

소문자 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; 
} 

답변

3

나는 그것의 의심 때문에 signedchar i 기본 설정됩니다. 소문자에 23을 추가하면 104 (127-23) 이상의 항목이 모두 음수로 변환됩니다. 코드를 살펴보면 후속 테스트가 실패하고 수정되지 않기 때문에 부정적인 상태를 유지합니다.

는 그 다음, intchar 연산을 할 char로 다시 변환하는 것이 좋습니다 ...하지만 당신은 아마 unsigned char를 사용하여이 문제를 해결할 수 있습니다.

+0

op가'int'를 인자로 취하는'printf()'의 '% c'변환 지정자를 사용하여 OP가'i'를 출력하기 때문에'char'로 다시 변환 할 필요가 없습니다. 'i'의 타입을'int'로 바꾸기 만하면됩니다. – caf