strupr (); сделано мной не работает - PullRequest
1 голос
/ 02 июля 2010

я сделал программу для преобразования строчных букв в прописные, как strupr (); в strings.h .. он печатает код ascii, когда я запускаю программу

#include<stdio.h>
#include<conio.h>

void xstrupr(char string[]);

void main(void)
{
    char string[40];
    puts("Enter string:");
    gets(string);
    xstrupr(string);
    printf(" %s ",string);
    getch();
}

void xstrupr(char string[])
{
    int i;
    for(i=0;;i++)
    {
        if ((string[i]>='a')&&(string[i]<='z') )
            string[i]+=64;
        else
            if(string[i]=='\0')
                break;
    }
}

Ответы [ 7 ]

8 голосов
/ 02 июля 2010

Это ужасно, если вы не против, что я говорю.Конечно, не принимайте это на свой счет.

  • Не полагайтесь на значения ASCII, никогда не кодируйте реальные значения символов в виде буквенных чисел.
  • Не используйте char переменныекак циклические индексы;они обычно слишком малы.
  • Используйте islower(), чтобы проверить, является ли символ строчными.
  • Используйте toupper(), чтобы преобразовать его в верхний регистр.
  • Поймите, что подобный код не работает для большинства языков
  • Использование широких символов также недостаточно;в некоторых языках есть слова, которые меняют длину (количество символов) при переходе от строчных букв к верхним.

Моя предлагаемая реализация в этом стиле будет выглядеть так:разумная (на мой взгляд) реализация того, что выглядело так, как вы хотели достичь, она ни в коем случае не идеальна и не отвечает всем моим жалобам.

2 голосов
/ 20 июля 2010

На самом деле в ASCII Chart диапазоны следующие:

  • от А до Я : от 65 до 90
  • от a до z : от 97 до 122

Ваша отредактированная программа выглядит так:

#include<stdio.h>
#include<conio.h>

void xstrupr(char string[]);

void main(void)
{
    char string[40];
    puts("Enter string:");
    gets(string);
    xstrupr(string);
    printf(" %s ",string);
    getch();
}

void xstrupr(char string[])
{
    int i;
    for(i=0;;i++)
    {
    if ((string[i]>='a')&&(string[i]<='z') )
        string[i]-=32;
    else
        if(string[i]=='\0')
        break;
    }
}

См. Таблицу ascii ниже:

Таблица ASCII http://www.unitechnical.info/Products/ASCII-Chart.jpg


Источники:

Изображение взято с http://www.unitechnical.info/

2 голосов
/ 02 июля 2010

Вы возвращаете целое число (либо 0, либо i-64) и обрабатываете его так, как если бы он был указателем на завершенную нулем строкуЯ не удивлен, что печатает мусор.

1 голос
/ 02 июля 2010

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

Вы не получите заглавную версию письма, добавив 64 к нему.Более того, просто ввести магическое число неясно и может быть неправильно для другого набора символов.

Попробуйте изменить string[i] += 64; на string[i] += 'A' - 'a';.Это будет работать во всех наборах символов, где есть постоянная разница между заглавными и строчными буквами.

Теперь, в некоторых случаях это не получитсяНапример, в EBCDIC буквы не являются смежными, поэтому диапазон от «a» до «z» не является буквенным.Вот почему в реальном коде вы используете стандартные функции, такие как isalpha() и toupper(), но это хорошо в качестве упражнения.

1 голос
/ 02 июля 2010

Во-первых, разница в значении ASCII между прописными и строчными буквами составляет 32, а не 64.

Во-вторых, и это самое главное, библиотека C предоставляет функции tolower () и toupper (), которые работают не только в ASCII, но и в любой кодировке, которую вы используете в данный момент.

1 голос
/ 02 июля 2010

Функция завершается, когда встречается символ нижнего регистра, вместо этого она заменяет текущий символ.

Также тип, возвращаемый strupr(), неверен, он не должен быть char. И это не возвращает правильную вещь. Так что это, безусловно, выводит мусор.

[Я не даю вам всех деталей, так как вы, кажется, учитесь, не стесняйтесь спрашивать больше].

0 голосов
/ 02 июля 2010
  1. Во-первых, ваша функция возвращает символ. Это не имеет значения.
  2. return будет прерывать функцию, а не заменять символ.
  3. Это совершенно неправильно. Upr не может быть сделано для каждого персонажа. Пример. Upr немецкого eszett 'ß' является двумя символами, иначе "SS". Предполагая, что ваш ввод char * не содержит utf-8, является «текстовым преступлением».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...