Как я могу поменять апостроф на единицу вместо 3 байтов? (\ 342 \ 200 \ 231) с использованием C - PullRequest
0 голосов
/ 21 января 2020

надеюсь, кто-то может помочь мне здесь. Я пытаюсь создать программу, которая подсчитывает количество слов, гласных, специальных символов и т. Д. c. Проведя некоторое копание, я понял, что значения, сохраняемые для одного апострофа, рассчитываются для 3 позиций, где должна быть только одна. Если кто-нибудь знает, как решить эту проблему, я был бы очень признателен! Спасибо !!

for (int i = 0; sentence[i] != '\0'; ++i) {
    if (sentence[i] == 'a' || sentence[i] == 'e' || sentence[i] == 'i' || sentence[i] == 'o' || sentence[i] == 'u'||
        sentence[i] == 'A' || sentence[i] == 'E' || sentence[i] == 'I' || sentence[i] == 'O' || sentence[i] == 'U') {
        ++numVowels;
    } else if (sentence[i] == ' ') {
        ++numSpaces;
    } else {
        ++numSpecials;
        printf("%c\n",sentence[i]);
    }

    if ((sentence[i] == ' ' && sentence[i+1] != ' ') || (sentence[i] != '\0' && sentence[i+1] == '\0')) {
        ++numWords;
    }
}

printf("Number of words: %d\n", numWords);
printf("Number of spaces: %d\n", numSpaces);
printf("Number of vowels: %d\n", numVowels);
printf("Number of consonants and special characters: %d\n", (numSpecials));

Ответы [ 3 ]

4 голосов
/ 21 января 2020

\342 \200 \231 - это E2 80 99 в шестнадцатеричном формате, который является UTF-8 закодированной формой U + 2019 ПРАВАЯ ОДНОКВАЖНАЯ КАРТА МАРКА , которая не апостроф. Это одна из умных кавычек в Unicode

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

Однако, так как вы хотите считать слова, гласные, специальные символы что слишком широко. Как бы вы посчитали такие символы, как á, è, ü ...? Что считается специальными символами? Каждый из них насчитывает десятки тысяч, и вы не сможете работать над общим решением без каких-либо внешних библиотек

Если вы просто хотите сделать это в качестве упражнения, подумайте об ограничении ввода до Только ASCII

1 голос
/ 21 января 2020

Добро пожаловать в программирование Unicode. То, что у вас есть, это «ПРАВИЛЬНАЯ ОДНОКВАЖНАЯ КВАРТИРА», возможно, из какого-то редактора текстовых документов, поскольку они обычно автоматически заменяют ", ' и т. Д. c. с более точным значением c, основанным на контексте.

Если вам нужно иметь дело с Unicode, вы, вероятно, захотите использовать библиотеку Unicode или данные из unicode.org release, Хотя расшифровка самого UTF-8 проста, такие вопросы, как «это знак пунктуации?», «Это пробел?», «Это часть буквы?» и др c. не являются.

Специфическими c данными, которые вы хотите получить, я полагаю, является «Категория символов Unicode». Самые популярные категории:

  • Буква
  • Метка ( объединяющие символы , et c.)
  • Число
  • Знаки пунктуации
  • Символ
  • Разделитель (пробелы, абзац и т. Д. c.)
  • Другое (управляющие коды и т. Д. c.)

Есть также много подкатегорий, хотя я не думаю, что они вам нужны. http://www.fileformat.info/info/unicode/category/index.htm, кажется, имеет хороший список для исследования в Интернете.

Основная проблема, вероятно, заключается в подсчете "гласных", поскольку он не очень хорошо переводится на все языки / сценарии. Потенциально вы можете «разложить» такие вещи, как Á, и рассчитывать только полученные буквы AEIOU для вашей цели.

0 голосов
/ 21 января 2020

Ваш ввод, вероятно, использует кодировку UTF-8 . Вот список символов, которые можно сохранить в одном байте: http://www.asciitable.com/

Используете ли вы тот же апостроф, что и там?

'

Если нет, то вы должны обрабатывать его как несколько байтов.

...