Присвоение делает указатель из целого числа без броска

Вы должны изменить пользовательский агент, например:

UserDefaults.standard.register(defaults: ["UserAgent" : "Chrome Safari"])

22
задан jww 14 September 2014 в 17:55
поделиться

8 ответов

Строки C не являются чем-то, как Java Strings. Они по существу массивы персонажей.

Вы получаете ошибку, потому что Strtolower возвращает CHAR. Чар - это форма целого числа в C. Вы назначаете его в Char [], которая является указателем. Отсюда «преобразование целого числа указателям».

Ваш Strtolower делает все свои изменения на месте, нет причин для него, чтобы получить что-либо, особенно не символ. Вы должны «вернуть» пустоту или символ *.

На вызове на STRTOLOWER также нет необходимости для присваивания, вы по сути, просто пропускаете адрес памяти для CString1.

В моем опыте, строки в C - самая сложная часть, чтобы учиться, чтобы кто-то, кто приходит из фона Java / C #, обратно к C. Люди могут ладить с распределением памяти (поскольку даже в Java вы часто выделяете массивы). Если ваша возможная цель - C ++, а не C, вы можете предпочесть меньше сосредоточиться на строках C C, убедитесь, что вы понимаете основы и просто используете строку C ++ из STL.

38
ответ дан 29 November 2019 в 04:29
поделиться
  • 1) Не используйте gets! Вы вводите уязвимость переполнения буфера. Вместо этого используйте fgets(..., stdin).

  • 2) В strToLower вы возвращаете char вместо char -массива. Либо верните char*, как предложил Autopulated, либо просто верните void, так как вы все равно изменяете ввод. В результате просто напишите

& nbsp;

 strToLower(cString1);
 strToLower(cString2);
  • 3) Для сравнения строк без учета регистра вы можете использовать strcasecmp (Linux & amp; ; Mac) или stricmp (Windows).
1
ответ дан 29 November 2019 в 04:29
поделиться

Тип возврата Strtolower должен быть CHAR * CHAR (или это должно вообще ничего вернуть, так как он не выделяет строку)

5
ответ дан 29 November 2019 в 04:29
поделиться

Вы возвращаете CHAR, а не CHAR *, который является указателем на первый персонаж массива.

Если вы хотите вернуть новый массив символов вместо того, чтобы выполнить изменение установки, вы можете попросить уже выделенный указатель (CHAR *) в качестве параметра или неинициализированного указателя. В этом последнем случае вы должны выделить правильное количество символов для новой строки и помните, что в парах C, как всегда передается по значению, поэтому вы должны использовать Char ** в качестве параметра в случае массива, выделенного внутри функции. Конечно, абонент должен освободить этот указатель позже.

0
ответ дан 29 November 2019 в 04:29
поделиться

Нет, потому что это не имело бы никакого смысла. Если вы пытаетесь получить доступ к функции-члену «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 .

2
ответ дан 29 November 2019 в 04:29
поделиться

Вам не нужны эти два ассигнования:

cString1 = strToLower(cString1); 
cString2 = strToLower(cString2);

Вы изменяете строки на месте.

Предупреждения, потому что вы возвращаете CHAR, и присваивая ЧАР [] (которая эквивалентна Char *)

0
ответ дан 29 November 2019 в 04:29
поделиться
char cString1[]

Это массив I.E. Указатель на первый элемент диапазона элементов одного типа данных. Обратите внимание, что вы не передаете массив по значению, а By-Picketer.

char strToLower(...)

Однако это возвращает символ. Таким образом, ваше задание

cString1 = strToLower(cString1);

имеет разные типы на каждой стороне оператора присваивания. Вы фактически присваиваете «CHAR» (своего рода целое число) на массив, который разрешается к простому указателю. Из-за неявных правил конвертации C ++ это работает, но результат - мусор и дальнейший доступ к массиву вызывает неопределенное поведение.

Решение состоит в том, чтобы сделать retolower возврат CHAR * .

-1
ответ дан 29 November 2019 в 04:29
поделиться

STRTOLOWER должен вернуть символ * вместо символа. Что-то вроде этого будет делать.

char *strToLower(char *cString)
0
ответ дан 29 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: