Вы должны изменить пользовательский агент, например:
UserDefaults.standard.register(defaults: ["UserAgent" : "Chrome Safari"])
Строки C не являются чем-то, как Java Strings. Они по существу массивы персонажей.
Вы получаете ошибку, потому что Strtolower возвращает CHAR. Чар - это форма целого числа в C. Вы назначаете его в Char [], которая является указателем. Отсюда «преобразование целого числа указателям».
Ваш Strtolower делает все свои изменения на месте, нет причин для него, чтобы получить что-либо, особенно не символ. Вы должны «вернуть» пустоту или символ *.
На вызове на STRTOLOWER также нет необходимости для присваивания, вы по сути, просто пропускаете адрес памяти для CString1.
В моем опыте, строки в C - самая сложная часть, чтобы учиться, чтобы кто-то, кто приходит из фона Java / C #, обратно к C. Люди могут ладить с распределением памяти (поскольку даже в Java вы часто выделяете массивы). Если ваша возможная цель - C ++, а не C, вы можете предпочесть меньше сосредоточиться на строках C C, убедитесь, что вы понимаете основы и просто используете строку C ++ из STL.
1) Не используйте gets
! Вы вводите уязвимость переполнения буфера. Вместо этого используйте fgets(..., stdin)
.
2) В strToLower
вы возвращаете char
вместо char
-массива. Либо верните char*
, как предложил Autopulated, либо просто верните void
, так как вы все равно изменяете ввод. В результате просто напишите
& nbsp;
strToLower(cString1);
strToLower(cString2);
strcasecmp
(Linux & amp; ; Mac) или stricmp
(Windows). Тип возврата Strtolower должен быть CHAR *
CHAR
(или это должно вообще ничего вернуть, так как он не выделяет строку)
Вы возвращаете CHAR, а не CHAR *, который является указателем на первый персонаж массива.
Если вы хотите вернуть новый массив символов вместо того, чтобы выполнить изменение установки, вы можете попросить уже выделенный указатель (CHAR *) в качестве параметра или неинициализированного указателя. В этом последнем случае вы должны выделить правильное количество символов для новой строки и помните, что в парах C, как всегда передается по значению, поэтому вы должны использовать Char ** в качестве параметра в случае массива, выделенного внутри функции. Конечно, абонент должен освободить этот указатель позже.
Нет, потому что это не имело бы никакого смысла. Если вы пытаетесь получить доступ к функции-члену «T», как компилятор может указать, какой базовый класс пытаться разрешить члены?
Вы могли бы попытаться создать общий интерфейс для TypeOne и TypeTwo и иметь ограничение, указывающее этот интерфейс? Чего именно вы пытаетесь добиться?
-121--3595040-Возможно, TypeOne и TypeTwo наследуют интерфейс, а затем выполняют следующие действия.
public class SoftDrink<T>
where T: IMyType
{}
-121--3595045- Как уже отмечалось другими, в одном случае вы пытаетесь вернуть cString
(которое является значением char *
в данном контексте - указателем) из функции, которая объявляется для возврата char
(которое является целым числом). В другом случае выполняется обратное: выполняется присвоение char
возвращаемого значения указателю char *
. Это то, что запускает предупреждения. Конечно, необходимо объявить возвращаемые значения как char *
, а не как char
.
Обратите внимание BTW, что эти назначения на самом деле являются нарушениями ограничений с языковой точки зрения (т.е. они являются «ошибками»), так как запрещено смешивать указатели и целые числа в C, как это (кроме интегрального постоянного нуля). Ваш компилятор просто слишком простителен в этом отношении и сообщает об этих нарушениях как о простых «предупреждениях».
Я также хотел бы отметить, что в нескольких ответах вы можете заметить относительно странное предложение вернуть недействительные
из ваших функций, поскольку вы изменяете последовательность на месте. Хотя это, безусловно, будет работать (так как вы действительно изменяете последовательность на месте), нет ничего плохого в возвращении того же значения из функции. Фактически, это довольно стандартная практика в языке Си, где это применимо (взгляните на стандартные функции, такие как strcpy
и другие), поскольку она позволяет «цепочку» вызовов функций, если вы решите использовать ее, и практически ничего не стоит, если вы не используете «цепочку».
Это означает, что назначения в вашей реализации compeyString
выглядят мне совершенно лишними (даже если они ничего не сломают). Я бы либо избавился от них
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
.
Вам не нужны эти два ассигнования:
cString1 = strToLower(cString1);
cString2 = strToLower(cString2);
Вы изменяете строки на месте.
Предупреждения, потому что вы возвращаете CHAR, и присваивая ЧАР [] (которая эквивалентна Char *)
char cString1[]
Это массив I.E. Указатель на первый элемент диапазона элементов одного типа данных. Обратите внимание, что вы не передаете массив по значению, а By-Picketer.
char strToLower(...)
Однако это возвращает символ. Таким образом, ваше задание
cString1 = strToLower(cString1);
имеет разные типы на каждой стороне оператора присваивания. Вы фактически присваиваете «CHAR» (своего рода целое число) на массив, который разрешается к простому указателю. Из-за неявных правил конвертации C ++ это работает, но результат - мусор и дальнейший доступ к массиву вызывает неопределенное поведение.
Решение состоит в том, чтобы сделать retolower
возврат CHAR *
.
STRTOLOWER должен вернуть символ * вместо символа. Что-то вроде этого будет делать.
char *strToLower(char *cString)