2015-08-18 2 views
1

У меня есть функция, которая получает const char*, и я хочу преобразовать ее в нижний регистр. Но я получаю ошибку:Как преобразовать указатель постоянного символа в нижний регистр в C?

error: array initializer must be an initializer list or string literal

Я попытался скопировать строку переменной в другой массив, так что я мог бы опустить случай его. Но я думаю, что у меня что-то смущено.

Это моя функция:

int convert(const char* string) 
{ 
    char temp[] = string; 
    temp  = tolower(temp); //error is here 
    //do stuff 
} 

Я изо всех сил, чтобы понять, что означает эта ошибка, может кто-нибудь помочь в объяснении его?

+1

температура является строкой и ToLower принимает символ/инт. – Ant

+1

Если вы не собираетесь использовать книгу или другой надежный ресурс обучения, вы сэкономите много времени, прочитав документацию о любых функциях, с которыми вы столкнулись. 'tolower' в этом случае. –

+0

@MattMcNabb Да, основное замешательство - это лучший способ конвертировать в int. – Sir

ответ

4

tolower принимает один символ и возвращает его в нижнем регистре.

Даже если это не так, массивы не могут быть назначены. Массивы и указатели - это не одно и то же.

Вы, вероятно хотите сделать что-то вроде:

char *temp = strdup(string); // make a copy 

// adjust copy to lowercase 
unsigned char *tptr = (unsigned char *)temp; 
while(*tptr) { 
    *tptr = tolower(*tptr); 
    tptr++; 
} 

// do things 

// release copy 
free(temp); 

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

+1

Должно быть '* tptr = tolower ((unsigned char) * tptr);' –

+0

@MattMcNabb почему? 'tolower' принимает' int'; тип promotion преобразует 'char' в' int'. – Tommy

+0

Предполагая, что вы означали 'char', а не' char * 'в этом последнем комментарии: да, продвижение дает неправильный результат. 'tolower' ожидает int в диапазоне от 0 до 255, однако продвижение' char' даст int в диапазоне от -128 до '127' (в большинстве систем) –

0

Пожалуйста, обратите внимание, что, ToLower() принимает характер и не строку:

int tolower (int c); 

Также вы пытаетесь скопировать строку из string в temp[] переменной. Там нет перегрузки оператора = в C, чтобы скопировать строку в массив char.

Теперь о вашей ошибке:

error: array initializer must be an initializer list or string literal

Это говорит о том, что массив должен быть инициализирован с помощью списка начальных отдельных элементов или вы можете непосредственно присвоить строковый литерал.

например:

char temp[] = "Hi";

char temp[] = {'H','i','\0'};

Кроме того, проверьте ваше заявление:

temp = tolower(temp); 

Здесь возвращаемый тип tolower() является int, что вы назначаете его в массив temp который является неправомерным.

Вы можете использовать следующий фрагмент кода, используя strlwr():

int convert(const char* string) 
{ 
    char *temp= malloc(strlen(string)+1); 
    strcpy(temp,string); 
    strlwr(temp); 
    //do your stuff 
} 
+1

Итак, что является самым простым способом конвертировать, чтобы ввести его в нижний регистр? – Sir

+0

Вы не выделяете нужный объем памяти. – this

+0

@this Можете ли вы дать подробную информацию? – TryinHard

0

Прежде всего, tolower принимает char или int, а не строка.

, но даже если вы прошли char, ваш код не будет работать, потому что эта ошибка array initializer must be an initializer list or string literal, означает, что вы должны инициализировать его, используя один из следующих способов:

char arr[4] = {'h', 'e', 'y','\0'}; // initializer list 
char arr[4] = "hey"; // string literal 

char arr[] = "hey"; // also a string literal 

char arr[4]; 

arr[0] = 'h'; 
arr[1] = 'e'; 
arr[2] = 'y'; 
arr[4] = '\0'; 
+0

tolower принимает аргумент int. Эти два порядка * не являются строковыми литералами, а являются правильными массивами. – this

+0

@this инициализатор массива должен быть списком инициализатора или строковым литералом, что я сказал, я не понял, что вы пытаетесь сказать. – Nishant

+0

Ну, arr - массив, а «эй» - строковый литерал, так какой он? Вы могли бы прояснить это, поэтому читатели не будут думать, что arr указывает на строковый литерал. – this

Смежные вопросы