Перейти к содержимому

Как сравнить char и string c

  • автор:

Как сравнить два char string

пытаюсь сравнить и если слово палиндром, сделать вывод через cout, подскажите в чем ошибся,спасибо!

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

Ответы с готовыми решениями:

Как сравнить элементы массива string и char?
Есть два массива: mas_ascii и str содержащий текст с файла char mas_ascii ; for (int i = 0; i.

Как сравнить два указателя типа char?
char *p1; p1 = new char; p1 = "qwert"; char *p2; p2 = new char; p2 = "zz"; if(*p1==*p2).

Как сравнить два элемента массива типа string?
Задание. Вычислить какая компания чаще всего участвовала в роли истца. У меня есть массив в.

есть массив char. есть строка string. как присвоить значению string-a значение char-a?
есть массив char. есть строка string. как присвоить значению string-a значение char-a?

Racket: Сравнение строк и символов, предикаты

Пусть заголовок вас не смущает: сравнить char и string не получится, ведь это разные типы!

(char? #\c #\b #\a) ; #t (char=? #\a #\b) ; #f (string? "c" "b" "a") ; #t (string=? "a" "b") ; #f 

Глядя на этот пример, вы и сами сможете догадаться, как работают функции string=? 🙂

Регистронезависимость

Упомянутые функции сравнивают строки и строковые символы буквально или, как говорят, лексикографически. Однако при работе с текстом часто нужно сопоставлять строки без учёта регистра, или производить регистронезависимое сравнение (case-insensitive comparison). В Racket для каждой функции сравнения есть регистронезависимый вариант, имеющий суффикс -ci («case-insensitive»):

(string=? "Apple" "apple") ; #f (string-ci=? "Apple" "apple") ; #t (char>? #\C #\b) ; #f (char-ci>? #\C #\b) ; #t 

Группы символов

Строковые символы могут быть буквами, цифрами, знаками препинания. Более того, буквы могут принадлежать разным алфавитам, одни из которых имеют разные регистры, к другим же данная концепция в принципе не применима. Получается, что некоторый строковый символ может принадлежать к одной или сразу к нескольким группам символов. Проверить принадлежность к основным группам символов можно с помощью набора предикатов с именами вида char-alphabetic? и char-lower-case? :

(char-alphabetic? #\a) ; #t (char-alphabetic? #\u3BB) ; #t — "λ" это буква, пусть и греческая (char-lower-case? #\a) ; #t (char-lower-case? #\A) ; #f 

Предикатов такого вида в Racket больше десятка, почитать обо всех вы сможете в документации.

Отдельных функций, которые бы проверяли, что все символы некоторой строки принадлежат к некоторой группе, Racket не предоставляет. Впрочем, организовать такую проверку довольно просто, если взять функцию andmap , работающую со списками, и объединить со string->list :

(andmap char-alphabetic? (string->list "asd")) ; #t (andmap char-alphabetic? (string->list "r2d2")) ; #f 

Если заменить andmap на ormap , то вместо проверки на «все символы…» получится проверка на «хотя бы один символ…»!

Задание

Реализуйте два предиката: password-valid? и password-good? . Оба должны оценивать строку.

password-valid? должен возвращать #t , если строка состоит только из букв и цифр ( char-alphabetic? и char-numeric? ) и при этом имеет ненулевую длину.

password-good? должен возвращать #t , если строка содержит и буквы, и цифры, а длина строки не меньше восьми символов. И, разумеется, хороший пароль должен быть valid!

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

  • Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Как сравнить string и char[] по содержимому?

C++ как сравнить кавычки с char и string
В общем, приведу лучше кусочек кода, так понятнее будет) switch (buff)< case '"': \\тут внутри.

Как сравнить два char string
подскажите сделал задачу которая проверит является ли данная строка палиндромом вот код.

Как сравнить элементы массива string и char?
Есть два массива: mas_ascii и str содержащий текст с файла char mas_ascii ; for (int i = 0; i.

есть массив char. есть строка string. как присвоить значению string-a значение char-a?
есть массив char. есть строка string. как присвоить значению string-a значение char-a?

288 / 233 / 33
Регистрация: 09.02.2011
Сообщений: 435

string это массив элементов char
допустим есть строка
string str = «abc»;
обратившись к элементу массива str[1], ты получишь символ ‘b’

220 / 143 / 35
Регистрация: 25.06.2010
Сообщений: 383

string str = "bla bla bla"; char [] ch = str.ToCharArray();

Потом сравнивайте с другим массивом.
Хотя у dzjundzja88 проще . Я поторопился.
Регистрация: 09.05.2010
Сообщений: 384

NiceGuyEddy
В общем есть строка которая сохранена в char[] s, есть которая в ковычках: «фыва»
Как сравнить эту и эту.
if (s = «фыва») — не работает

220 / 143 / 35
Регистрация: 25.06.2010
Сообщений: 383

ЦитатаСообщение от AKE Посмотреть сообщение

NiceGuyEddy
if (s = «фыва») — не работает

Одинарное равно — присвоение. Двойное равно — сравнение. Можно сравнить поэлементно. На Linq это вроде просто делается, но я в нем не силен пока.

Ну или так можно:

1 2 3 4 5 6 7 8 9 10 11 12
char[] s = new char[] { 'т', 'е', 'с','т' }; string str = "тест"; string str1 = ""; for (int i = 0; i  s.Length; i++) { str1 += s[i]; } if (str == str1) Console.WriteLine("Равны"); else Console.WriteLine("Не равны"); Console.ReadLine();

288 / 233 / 33
Регистрация: 09.02.2011
Сообщений: 435

Если я не ошибаюсь, то char[] s — это должен быть массив, каждый элемент которого это один символ. А Вы пытаетесь один символ сравнить со строкой «фыва». И символ в шарпе, вроде бы, берётся в одинарные кавычки

1485 / 1224 / 245
Регистрация: 02.04.2010
Сообщений: 2,783

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
using System; namespace CompareString { class Program { public static void Main(string[] args) { string s1 = "test"; char[] s2 = new char[4]{'t','e','s','t'}; if (string.Compare(s1, getStr(s2))==0) Console.WriteLine("=="); else Console.WriteLine("!="); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } public static string getStr(char[] s) { string ret=string.Empty; for (int i=0; is.Length; i++) ret += s[i]; return ret; } } }

Регистрация: 04.01.2017
Сообщений: 465

freeba, доброго времени суток!
Подскажите, есть ли функция позволяющая сравнить отдельный элемент строки с каждым элементом массива символов?

Или это возможно только через цикл?

1485 / 1224 / 245
Регистрация: 02.04.2010
Сообщений: 2,783
Vlad__i__mir, В LINQ есть метод Any

Эксперт .NET

10142 / 6129 / 1442
Регистрация: 25.05.2015
Сообщений: 18,587
Записей в блоге: 14

1 2 3 4 5 6
string str1 = "asdf"; char[] chars2 = new char[] { 'a', 's', 'd', 'f' }; if (str1.SequenceEqual(chars2)) { }

Регистрация: 04.01.2017
Сообщений: 465

Добавлено через 4 минуты

ЦитатаСообщение от freeba Посмотреть сообщение

Vlad__i__mir, В LINQ есть метод Any
Вы имели в виду IndexOfAny()?

Эксперт .NET

10142 / 6129 / 1442
Регистрация: 25.05.2015
Сообщений: 18,587
Записей в блоге: 14
Vlad__i__mir, он имел в виду IEnumerable.Any() .
523 / 940 / 35
Регистрация: 08.01.2017
Сообщений: 5,432

ЦитатаСообщение от freeba Посмотреть сообщение

string ret=string.Empty;
Попутно: чем отличается string.Empty и «» ?
Чем в данном случае использование «» хуже?

Эксперт .NET

10142 / 6129 / 1442
Регистрация: 25.05.2015
Сообщений: 18,587
Записей в блоге: 14

  • Empty есть и у других классов, например EventArgs и Guid .
  • В «» легко не заметить пробела » «.
  • А ещё такой прикол с юникодом:

Эксперт .NET

11809 / 8130 / 1241
Регистрация: 21.01.2016
Сообщений: 30,602

ЦитатаСообщение от Rius Посмотреть сообщение

А ещё такой прикол юникодный
Я немного не въехал, как это так получается.

Usaga, в личку ответил 🙂

Меню пользователя @ Rius
Посетить домашнюю страницу Rius
Читать блог

3479 / 2484 / 1172
Регистрация: 14.08.2016
Сообщений: 8,182

а вот это нехорошо, владеешь информацией — ф студию:)

Регистрация: 15.06.2012
Сообщений: 4,528

ЦитатаСообщение от NiceGuyEddy Посмотреть сообщение

На Linq это вроде просто делается,

с него лучше не начинать. На месте преподователя я бы скорее всего ожидал нечто такое.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
const string notMatch = "не совпадают"; const string match = "совпадают"; string str = "Nya!"; char[] ch_arr = new[] { 'N', 'y', 'a', '!' }; if (str.Length != ch_arr.Length) Console.WriteLine(notMatch); var result = true; for (var i = 0; i  str.Length; i++) { if (str[i] != ch_arr[i]) { result = false; break; } } if (result) Console.WriteLine(match); else Console.WriteLine(notMatch); Console.ReadKey();

Добавлено через 8 минут
Rius, хитрая. котяра

I’d prefer string to String. choosing string.Empty over «» is a matter of choosing one and sticking with it. Advantage of using string.Empty is it is very obvious what you mean, and you don’t accidentally copy over non-printable characters like «\x003» in your «»

Как сравнить char и string c++?

Компилятор выдает ошибку, что невозможно сравнить int и строку . Хотя, symbol является типом char (да, это буквенный эквивалент кода, но тем не менее). Я пытался преобразовать symbol к string , но ни (std::string) symbol , ни std::string(symbol) , ни std::string k = std::symbol(symbol) мне не помогли. Точно также, я пытался преобразовать alphabet[i] в char (ВНИМАНИЕ! В массиве array хранятся строковые значения, но односимвольные), но у меня ничего не вышло из-за различия типов char* и char . Код, который создает alphabet выглядит примерно так:

this->alphabet[0] = "А"; this->alphabet[1] = "Б"; и т.д. 

Отслеживать
kot_mapku3
задан 12 фев 2017 в 15:46
kot_mapku3 kot_mapku3
1,185 1 1 золотой знак 13 13 серебряных знаков 34 34 бронзовых знака
sizeof(alphabet) o_O А какое, вы думаете, значение этого выражения?
12 фев 2017 в 15:59
Вы бы код, который alphabet создает привели. (а то, слова ТС это только его слова)
12 фев 2017 в 16:00

Раз alphabet и в самом деле массив указателей на строки, то в _indexOfSymbol вместе с ним надо передавать его размер (или завершать этот массив нулевым указателем (аналогично argv[] в параметрах main() )

12 фев 2017 в 16:57
ну, я там поправил. Он сейчас передает.
12 фев 2017 в 16:58

Ответ вообще-то уже есть, я его там ниже написал, но здесь не добавил размер массива, сейчас поправлю.

12 фев 2017 в 16:59

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

У вас alphabet — не строка, а указатель на строку. Ну и sizeof(alphabet) выдаёт размер указателя (то есть, 4 или 8, в зависимости от вашей платформы), а не размер строки.

Кроме того, размер std::string считается не так. Сама строка выделяется где-то в куче, а sizeof выдаёт размер лишь самого объекта, то есть, содержащихся в нём указателей.

Правильный цикл такой:

for (int i = 0; i < alphabet->size(); ++i)

Кроме того, финальный return NULL , судя по всему, неправильный, ведь NULL — это просто 0, и значит, возвращаемое значения будет выглядеть как будто бы символ нашёлся на нулевой позиции.

Впрочем, вы можете просто не строить велосипед, а воспользоваться встроенной функцией поиска: alphabet->find(symbol) . Если символ не найден, она вернёт константу std::string::npos .

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

int analysis::_indexOfSymbol(char symbol, std::string* alphabet, size_t array_size) < for (int i = 0; i < array_size; ++i) < // здесь можно искать вхождение символа: auto pos = alphabet[i].find(symbol); if (pos != std::string::npos) return i; >return -1; // или какое-то другое значение, не могущее быть индексом > 

Достать размер массива из указателя нельзя.

Альтернативный путь — использовать вместо массива (ссылку на) std::vector , вот он-то как раз знает размер своих данных.

[Или можно сделать метод шаблонным, и принимать std::array , но этот вариант может и подойти, если размер данных динамический.]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *