Функция Tolower для массива строк в C

У меня есть массив строк, и я пытаюсь преобразовать все символы в нижний регистр.

void make_lower(char **array)
{   
int i = 0;
while (array[i] != NULL){
       array[i] = tolower(array[i]);
       i++;
}
}

Я знаю, что функция tolower считывает символы по одному, а не всю строку сразу. Вот почему я подумал, что мне нужно использовать такой цикл, но я все равно получаю предупреждения, и функция не работает:

passing argument 1 of ‘tolower’ makes integer from pointer without
a cast [-Werror]
note: expected ‘int’ but argument is of type ‘char *’
assignment makes pointer from integer without a cast [-Werror]

Я был бы очень признателен за вашу помощь.


person caddy-caddy    schedule 15.04.2015    source источник
comment
Используйте двойные петли. Один для перебора количества строк, а другой для перебора каждого символа в каждой строке. array относится к типу char**. tolower ожидает аргумент типа int, но вы даете array[i] типа char*   -  person Spikatrix    schedule 15.04.2015
comment
Поскольку array[i] является строкой, вам нужен еще один цикл.   -  person Some programmer dude    schedule 15.04.2015
comment
Указатель на указатель не является массивом. На что он указывает, на массив указателей?   -  person Lundin    schedule 15.04.2015


Ответы (1)


Вам нужна пара вложенных циклов, один для строки, один для символов внутри нее.

#include <stdio.h>
#include <ctype.h>

void make_lower(char **array)
{   
    int i = 0, j;
    while (array[i] != NULL){
        j = 0;
        while (array[i][j] != '\0') {
             array[i][j] = tolower(array[i][j]);
             j++;
        }
        i++;
    }
}    

int main(void) {
    char s1[]="ONE", s2[]="tWo", s3[]="thREE";
    char *array[] = {s1, s2, s3, NULL };
    make_lower(array);
    printf ("%s\n", array[0]);
    printf ("%s\n", array[1]);
    printf ("%s\n", array[2]);
    return 0;
}

Выход программы:

one
two
three
person Weather Vane    schedule 15.04.2015
comment
Вместо указателя NULL в конце списка строк вы можете передать размер списка в функцию. Вероятно, это немного ускорило бы программу. - person Lundin; 15.04.2015