strlen () плохо работает со специальными символами - PullRequest
1 голос
/ 03 апреля 2019

При попытке определить длину строки низкоуровневых символов с помощью функции strlen я заметил, что она не работает должным образом, когда строка содержит испанские символы, которых нет на английском языке, например, восклицательный знак открытия! , акценты или буквы -. Все эти элементы считаются двумя символами, ситуация, которая не исправлена ​​в Locale.

#include <cstring>
#include <iostream>

int main() {
    const char * s1 = "Hola!";
    const char * s2 = "¡Hola!";
    std::cout << s1 << " has " << strlen(s1) << " elements, but " <<  s2
              << " has " << strlen(s2) << " intead of 6" << std::endl;
}

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

1 Ответ

2 голосов
/ 03 апреля 2019

strlen дает вам число ненулевых char объектов в буфере, на которое указывает его аргумент, вплоть до первого нуля char. Ваша система, очевидно, использует кодировку символов (скорее всего, UTF-8), где эти проблемные символы занимают более одного байта (то есть более одного char объекта).

Как решить эту проблему, зависит от того, что вы пытаетесь сделать. Для определенных операций (таких как определение размера буфера, необходимого для хранения строки), результат из strlen является 100% правильным, поскольку это именно то, что вам нужно. Для большинства других целей добро пожаловать в огромный мир символов / байтов / кодов / любых нюансов. Возможно, вы захотите прочитать текстовые кодировки, Unicode и т. Д. http://utf8everywhere.org/ может быть хорошим сайтом для начала.

Вы упомянули, что это университетское задание: исходя из цели обучения, вам может потребоваться реализовать некоторую форму кодирования / дешифрования UTF или просто держаться подальше от символов, не входящих в ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...