не могу преобразовать строчные буквы в строчные по директиве препроцессора - PullRequest
2 голосов
/ 09 июля 2010

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

#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#define UPPER([])  ([]-32)
void fstring_convert(char string[]);
void main(void)
{
char string[40];
printf("Enter a string:");
gets(string);
fstring_convert(string);
printf("%s",string);
getch();
}

void fstring_convert(char string[])
{
    int i;
 for(i=0; ;i++)
 {
    if(string[i]==' ')
    {
        string[i]=string[i+1];
    }
    if(isdigit(string[i]))
    {
    string[i]+=1;
    }
    UPPER('string[i]');
    if(string[i]=='\0')
    break;
 }

}

Ответы [ 4 ]

6 голосов
/ 09 июля 2010

Препроцессоры не имеют петель.

Таким образом, для строки произвольной длины невозможно преобразовать все символы в верхний регистр с помощью макроса препроцессора.

Код у вас выше глючит, потому что ваш макрос должен выглядеть так:

#define TOUPPER(x) x = (x>='a' && x<='z')?(x-32):x;

А затем вызовите TOUPPER(string[i]) в вашем for цикле.

Но я не вижу смысла макроса.

4 голосов
/ 09 июля 2010

Вы должны использовать стандартную библиотечную функцию C toupper() для каждого символа строки (в цикле).Эта функция имеет преимущество правильной обработки не алфавитных символов.

3 голосов
/ 09 июля 2010

Это домашнее задание - научить вас ascii и преобразованию типов.

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

Подсказка: символ может быть разыгран как int.

1 голос
/ 31 декабря 2011

Если вы предполагаете, что имеете дело с ASCII, то вы можете также воспользоваться преимуществами расположения символов.Чтобы преобразовать в верхний регистр, выполните c & ~0x20.Чтобы преобразовать в нижний регистр, выполните c | 0x20.Для переключения между прописными и строчными буквами, c ^ 0x20.Это в основном равносильно добавлению или вычитанию 32 (== 0x20), но лучше, если их многократно применять, то, что вы ожидаете, например, toupper(toupper(c)) - это верхний регистр, а не c - 64, т.е.out http://www.kernel.org/doc/man-pages/online/pages/man7/ascii.7.html, особенно шестигранный стол в конце.Это ясно показывает отношения между разными персонажами.Есть несколько хороших закономерностей, но я подозреваю, что по историческим причинам есть некоторые неприятные несоответствия.Например, чтобы преобразовать между [ и ] или { и }, вы можете просто сделать 'c ^ 0x6', но между ( и ) это другое и другое для <и >.Однако, тем не менее, все еще возможно определить выражение без ветвей (т.е. без if s и тому подобное), чтобы вычислить совпадающий разделитель для любого данного разделителя.

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