Остальное условие не выполняется C - PullRequest
0 голосов
/ 01 мая 2018

Я работаю с указателем на массив символов. Этот код должен переключать регистры букв, удалять цифры, печатать два пробела вместо одного и печатать все остальные символы одинаково. Все остальное прекрасно, за исключением печати других символов. Кажется, это должно быть не проблема, но я не могу понять это. Видите что-нибудь, что выглядит неправильно?

void compareDuplicates(FILE * ifp, char mode){

    /* size MAXCHARS+1 to hold full array + null terminate*/
    char newArray [MAXCHARS +1] = {0};
    char oldArray [MAXCHARS +1] = {0};
    char * newStr = newArray;
    char * oldStr = oldArray;
    char * tempStr;
            /* fill array, test for EOF*/
            while(fgets(newStr,MAXCHARS, ifp)){
//if strings are the same, do not print anything
                    if(strcmp(newStr, oldStr) !=0){
//else print
                            testStrings(newStr);
                    }
//set oldStr pointer to newStr, set newStr pointer to oldStr reset newStr memory 
//reset memory of newStr to all null chars
                            tempStr = oldStr;
                            oldStr = newStr;
                            newStr = tempStr;
                            memset(newStr,'\0',MAXCHARS);

            }

} 

void testStrings(char * array1){
    int i = 0;
    char c;
    while(*(array1+i) != '\0'){
            if(*(array1+i) >= 'A' && *(array1+i) <= 'Z'){
                    c = *(array1+i)+32;
                    printf("%c",c);
            }
            else if(*(array1+i) >= 'a' && *(array1+i) <='z'){
                    c = *(array1+i)-32;
                    printf("%c",c);
            }
            else if(*(array1+i) == ' '){
                    c = *(array1+i);
                    printf("%c",c);
                    printf("%c",c);
            }
            else if(*(array1+i) >= '0' || *(array1+i) <= '9'){
                    i++;
                    continue;
            }
            else{
                    c = *(array1+i);
                    printf("%c",c);
            }
            i++;
    }
    printf("\n");
}

например, если даны строки:

CONSECUTIVE_LINE
CONSECUTIVE_LINE
CONSECUTIVE_LINE
123 REPEAT 
123 REPEAT 
232unique-line

вывод будет:

consecutiveline
  repeat
UNIQUELINE

, представляющий удаление последовательных строк, изменение регистра, добавление двух пробелов вместо одного и удаление цифр. Однако он не будет печатать обычные символы подчеркивания и другие нецелевые символы.

1 Ответ

0 голосов
/ 01 мая 2018

Этот тест ...

*(array1+i) >= '0' || *(array1+i) <= '9'

... всегда даст истину. Любой символ, с которым вы проверяете, будет больше, чем '0' или меньше, чем '9', потому что '0' < '9'. Возможно, вы хотели проверить, находится ли персонаж в этом диапазоне, для чего требуется && (логическое И), как вы делаете во всех остальных.

В качестве примечания, не думайте, что при кодировке символов алфавитные символы будут расположены последовательно. Это гарантированно будет верно только для цифровых символов. Лучшая проверка будет использовать isalpha и islower или isupper из заголовка ctype.h стандартной библиотеки.

...