Как уже отмечали другие, в одном случае вы пытаетесь вернуть cString
(в данном контексте значение char *
- указатель) из функции, которая объявлена для возврата char
(которая является целое число). В другом случае вы делаете обратное: вы присваиваете char
возвращаемое значение указателю char *
. Это то, что вызывает предупреждения. Вам, безусловно, нужно объявить возвращаемые значения как char *
, а не char
.
Обратите внимание, что эти назначения на самом деле являются нарушениями ограничений с языковой точки зрения (т.е. они являются "ошибками"), поскольку смешивать указатели и целые числа в C таким образом запрещено (кроме интегральная постоянная ноль). Ваш компилятор слишком прост в этом отношении и сообщает об этих нарушениях как о «предупреждениях».
Я также хотел отметить, что в нескольких ответах вы можете заметить довольно странное предложение вернуть void
из ваших функций, поскольку вы изменяете строку на месте. Хотя это, безусловно, будет работать (поскольку вы действительно изменяете строку на месте), нет ничего действительно плохого в том, чтобы возвращать то же значение из функции. Фактически, это довольно стандартная практика на языке Си, где это применимо (взгляните на стандартные функции, такие как strcpy
и другие), поскольку оно позволяет «связывать» вызовы функций, если вы решите использовать его, и практически ничего не стоит если вы не используете «цепочки».
Тем не менее, задания в вашей реализации compareString
выглядят для меня излишними (даже если они ничего не сломают). Я бы либо избавился от них
int compareString(char cString1[], char cString2[]) {
// To lowercase
strToLower(cString1);
strToLower(cString2);
// Do regular strcmp
return strcmp(cString1, cString2);
}
или используйте "цепочку" и сделайте
int compareString(char cString1[], char cString2[]) {
return strcmp(strToLower(cString1), strToLower(cString2));
}
(это когда ваш char *
возврат пригодится). Просто помните, что такие «цепочечные» вызовы функций иногда сложно отладить с помощью пошагового отладчика.
В качестве дополнительной, нереализованной заметки я бы сказал, что реализация функции сравнения строк таким деструктивным способом (она изменяет входные строки) может быть не самой лучшей идеей. Неразрушающая функция имела бы гораздо большую ценность, по моему мнению. Вместо того, чтобы выполнять явное преобразование входных строк в нижний регистр, обычно лучше реализовать собственную функцию сравнения строк без учета регистра символов и использовать ее вместо вызова стандартного strcmp
. * 1031. *