不能通过预处理器指令将小写转换为大写字符串

时间:2010-07-09 19:49:46

标签: c

我制作了一个程序,将小写字母转换为大写字母。我知道如何通过预处理程序指令将字符串转换为大写字母,但我不知道如何为字符串执行此操作。

#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 个答案:

答案 0 :(得分:6)

预处理器没有循环。

因此,对于任意长度的字符串,您不能使用预处理器宏将所有字符转换为大写。

您上面的代码是错误的,因为您的宏应该如下所示:

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

然后在TOUPPER(string[i])循环中调用for

但我不明白宏的意义是什么。

答案 1 :(得分:4)

您应该在字符串的每个字符上使用C标准库函数toupper()(在循环中)。此功能具有正确处理非字母字符的优点。

答案 2 :(得分:3)

这项家庭作业将教你如何进行ascii和类型转换。

一次循环字符串一个字母。对于每个字母,查找字母的ascii代码,(在编码时找到大写的偏移量,并在常量中存储),然后将偏移量添加到字母中。

提示:可以将char转换为int。

答案 3 :(得分:1)

如果你假设你正在处理ASCII,那么你也可以利用字符的布局方式。要转换为大写,请执行c & ~0x20。要转换为小写,请执行c | 0x20。要在大写和小写之间切换c ^ 0x20。这些基本上相当于增加或减去32(== 0x20),但它们更好,因为重复应用它们可以达到预期效果,例如: toupper(toupper(c))是大写字母,而不是c - 64,即垃圾。

查看http://www.kernel.org/doc/man-pages/online/pages/man7/ascii.7.html,尤其是靠近末尾的十六进制表。它清楚地显示了不同角色之间的关系。有一些不错的模式,但我怀疑,由于历史原因,有一些不幸的不一致。例如,要在[]{}之间进行转换,您只需执行'c ^ 0x6',但在(和{{1}之间进行转换它是不同的,它与)<的不同。但是,仍然可以定义无分支(即无> s等)表达式来计算任何给定分隔符的匹配分隔符。