2016-09-13 2 views
0

Как преобразовать символы в строчные буквы? Использование tolower() не работает.C - преобразование символа верхнего регистра в нижний регистр char

У меня есть массив как это:

static char clef[][7] = 
{ 
    ['A'] = "X", 
    ['B'] = "Y", 
    ['C'] = "Z", 
    ['D'] = "A", 
    ['E'] = "B", 
    ['F'] = "C", 
    ['G'] = "D", 
    ['H'] = "E", 
    ['I'] = "F", 
    ['J'] = "G", 
    ['K'] = "H", 
    ['L'] = "I", 
    ['M'] = "J", 
    ['N'] = "K", 
    ['O'] = "L", 
    ['P'] = "M", 
    ['Q'] = "N", 
    ['R'] = "O", 
    ['S'] = "P", 
    ['T'] = "Q", 
    ['U'] = "R", 
    ['V'] = "S", 
    ['W'] = "T", 
    ['X'] = "U", 
    ['Y'] = "V", 
    ['Z'] = "W" 

}; 

Этот код предназначен для замены букв в тексте на основе сдвига в ключевом массиве выше. Новый текст находится в верхнем регистре. Я хотел бы сделать их более строгими, за исключением случаев, следующих за «.». отмечая начало нового предложения.

static void crack(FILE *fp, const char *buffer, const char *pad1, const char *pad2, int shift_index) 
    { 
    int c; 
    char d; 
    const char *pad = pad1; 
    int col = 0; 

    idx = shift_index - 4; 

    for (int i = 0; (c = buffer[i]) != '\0'; i++) 
    { 
     if (col == 0) 
     { 
     fputs(pad, fp); 
     col += strlen(pad); 
     pad = pad2; 
     } 

     col++; 
     c = toupper(c); 

     printf("C :: %d", c); 

     if (c < MAX_CLEF && clef[c][0] != '\0') 
     { 

     /*fputs(clef[c - idx], fp); 
     printf("Value : %s", clef[c-idx]);*/ 


     if (buffer[i - 1] == '.') { 
      fputs(clef[c - idx], fp); 
     } 
     else { 
      fputs(tolower(clef[c-idx]), fp); 
     } 

     col += strlen(clef[c - idx]); 
     } 
     else 
     { 
     putc(c, fp); 
     col++; 

     printf("C :: right here %d", c); 
     } 
     if (col > 72) 
     { 
     putc('\n', fp); 
     col = 0; 
     } 


    } 

    } 

Я получаю некоторые предупреждения при компиляции, однако:

incompatible pointer to integer conversion passing 'char [7]' to parameter 
     of type 'int' [-Wint-conversion] 
      fputs(tolower(clef[c-idx]), fp); 

и

incompatible integer to pointer conversion passing 'int' to parameter of 
     type 'const char *' [-Wint-conversion] 
      fputs(tolower(clef[c-idx]), fp); 
+2

'fputs (tolower (clef [c-idx]), fp);' -> 'fputc (tolower (* clef [c-idx]), fp);' – BLUEPIXY

+0

Что @BLUE PIXY сказал, что тоже будет работать, как показано в моем ответе. – gsamaras

ответ

3

"А" является строкой.

«A» - персонаж.

Таким образом, вы подаете tolower() со строкой, поэтому изменить:

fputs(tolower(clef[c-idx]), fp); 

к этому:

fputc(tolower(clef[c-idx][0]), fp); 

Как сказал Димитрий, вы хотите использовать fputc(), не fputs(), которая хороша для строки.

Как писал Кейт Томпсон: tolower() имеет неопределенное поведение, если аргумент ne а не равно EOF. Чтобы преобразовать аргумент char, его необходимо преобразовать в unsigned char.

Минимальный пример:

#include <stdio.h> 
#include <ctype.h> 
int main (void) 
{ 
    char clef[][2] = 
    { 
     ['A'] = "X", 
    }; 

    printf("Uppercase = %s\n", clef['A']); 
    printf("Lowercase = %c\n", tolower((unsigned char)clef['A'][0])); 

    // or equivalently, as BLUEPIXY stated 
    printf("Lowercase = %c\n", tolower((unsigned char)(*clef['A'])));  

    return 0; 
} 

Выход:

C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
Uppercase = X 
Lowercase = x 
Lowercase = x 
+0

Вы предлагаете преобразовать строку в символ перед вызовом tolower()? объявление массива с помощью «А» не решило проблему. – user25976

+0

@ user25976 вы можете попробовать 'clef [index] [0]' – deamentiaemundi

+0

Да, вы не должны кормить строку, обновляемую. – gsamaras

0

Вы можете получить каждый элемент в массиве, поместите его в Окс полукокса и использовать putchar, а затем tolower

#include <stdio.h> 

int main(void) { 
    int counter=0; 
    char myChar; 

    char str[]="ABCDEFG.\n"; 

    while (str[counter]) 
    { 
     myChar=str[counter]; 
     putchar (tolower((unsigned char)myChar)); 
     counter++; 
    } 
    return 0; 
} 
+0

Повторяя мой комментарий к другому ответу: 'tolower()' имеет неопределенное поведение, если аргумент отрицательный и не равен 'EOF'.Чтобы преобразовать аргумент 'char', вам нужно преобразовать его в' unsigned char': 'tolower ((unsigned char) clef [c-idx])' –

+0

Спасибо, я обновлю это .... –