Как сравнить две строки на языке программирования c

Я сортирую свой массив автомобилей двумя способами. один год, который показан ниже. и еще один сделать. Make is a char* как сравнить строки, когда у меня есть только указатели на них?

вышеуказанный метод работает для int (year). Как я могу заставить его работать для указателей char?

8 ответов

в значительной степени один, путь позвонить strcmp . Если ваши строки (по какой-то странной причине) не завершены нулем, вы должны использовать strncmp вместо.

однако в C++ вы действительно не должны манипулировать строками в массивах символов, если вы можете разумно избежать этого. Использовать std::string вместо.

Я думаю, вам нужно использовать функцию strcmp ().

убедитесь, что char * не равен null, и если вы хотите, найдите функцию stricmp() для сравнения без учета регистра. В противном случае используйте strcmp().

char * фактически представляет адрес памяти первого символа в каждой строке. Таким образом, вы действительно не хотите сравнивать значения указателей, но содержимое, на которое они указывают.

В C его функция strcmp (), как уже говорилось. В C++ вы можете использовать функцию compare ().

Я, конечно, предполагаю, что здесь у вас есть char * для автомобиля делает

вы хотите сравнить с 0, потому что strcmp вернет 0, если нет разницы между двумя строками.
strcmp принимает два const char *.
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/

когда вам нужно сравнить два Чара указатели в частности, вы можете сравнить их обычным способом: с помощью операторов сравнения , > , == etc.

вопрос в случае THS является то, что вы не нужно сравнить два char указатели. Однако вам нужно сравнить две строки в стиле C эти указатели char указывают на. Чтобы сравнить строки c-стиля, вы должны использовать стандартный strcmp функция.

сверху, подход к обработке нулевых элементов в вашем алгоритме сортировки, похоже,не имеет никакого смысла. Представьте входной массив, содержащий чередующиеся указатели null и ненулевые указатели. Очевидно, что ваш алгоритм сортировки никогда ничего не сортирует, так как условие в вашем if никогда не будет правдой. Вам нужно пересмотреть свою обработку нулевых элементов. Конечно, прежде всего, вы должны решить, что делать с их. Игнорировать и оставить на месте? Нажать на один конец массива? Мой еще?

Я хочу убедиться, что моя строка заканчивается на «.foo». Я использую C, язык, с которым я не совсем знаком. Лучший способ сделать это — ниже. Любой гуру хочет убедиться, что я делаю это элегантно и мудро?

19 ответов

Не вызывайте strlen более одного раза для каждой строки.

РЕДАКТИРОВАТЬ: добавлена ​​нулевая проверка педантичности. Для ультрапедантичного, обсудите, должен ли он возвращать ненулевое значение, если оба str и суффикс оба равны NULL.

Вернет 0, если заканчивается «.foo».

У меня нет доступа к компилятору прямо сейчас, так может кто-нибудь сказать мне, если это работает?

В любом случае, убедитесь, что параметр квалифицирован как const , он говорит всем (включая компилятор), что вы не собираетесь изменять строку.

Если вы можете изменить сигнатуру своей функции, попробуйте изменить ее на

Это приведет к созданию более безопасного, более повторно используемого и более эффективного кода:

  1. Добавленные квалификаторы const гарантируют, что вы не по ошибке измените входные строки. Эта функция является предикатом, поэтому я предполагаю, что она никогда не будет иметь побочных эффектов.
  2. Суффикс для сравнения передается в качестве параметра, поэтому вы можете сохранить эту функцию для последующего повторного использования с другими суффиксами.
  3. Эта подпись даст вам возможность передавать длины строк, если вы их уже знаете. Мы называем это динамическим программированием.

Мы можем определить функцию следующим образом:

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

strlen(«.foo») с не требуются. Если вы действительно хотите иметь гибкость, вы можете использовать sizeof «.foo» — 1 — постоянная времени компиляции.

Кроме того, проверка нулевой строки будет хорошо.

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

Указатели на символы работают, указывая на первый символ в их массиве. Поэтому, когда вы делаете это, вы устанавливаете первый символ теста как «.» в «.foo» (если это то, что он содержит). Вот почему вам не нужно выделять память для него, поскольку он просто указывает на уже существующий массив символов.

Это самый эффективный (для компьютера) ответ, который вы найдете здесь.

Протестированный код, включает в себя тест:

Мой взгляд на это:

Если за точкой всегда есть что-то, мы могли бы заняться арифметикой с указателями:

Конечно, вы, вероятно, захотите добавить немного strlen, чтобы проверить, есть ли что-то за точкой:-)

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

Общее решение с одним strlen(иглой), strstr() и тестом для :

Вот общее решение, возвращающее те же значения, что и Pythons str.endswith(), с использованием memcmp(). Не проверять str / суффикс на NULL, другие функции libc str также не проверяют NULL:

Я обнаружил, что это самый простой способ достижения результата.

Вы также можете обобщить так:

Не похоже на этот вопрос о тестировании на суффикс строки:

Кстати, решение в оригинальном вопросе выглядит отлично, кроме повторных вызовов strlen.

Я всегда проверяю строковые функции glib, у них есть все виды полезных битов. Функция проверки суффикса уже существует.

Я немного новичок в C, поэтому я прошу прощения, если это не на 100%. но для меня это похоже на твердую оговорку!

Я хотел бы использовать мою версию:

Я написал это только потому, что кто-то сказал что-то о «наиболее оптимизированном».

Байты не загружаются из памяти более одного раза (если у вашего целевого процессора почти нет регистров). Копии символов / байтов в цикле должны быть преобразованы компилятором в один логический сдвиг на любом 32-битном или более крупном текстовом целевом процессоре, но я закодировал его так, как я делал, чтобы код C не должен был учитывать порядок байтов. Sfx (суффикс) преобразуется компилятором в целочисленную константу, а проверка суффикса равенства представляет собой один 32-битный целочисленный тест на равенство. Каждый новый байт должен проверяться на 0. Хотя есть несколько способов проверки на 0 как байта в слове, они не защитят от чтения за пределами памяти, к которой мы должны иметь доступ (при условии, что str указывает на правильно завершенную символьную строку).