【问题标题】:cant convert lowercase to uppercase a string by preprocessor directive无法通过预处理器指令将字符串小写转换为大写
【发布时间】:2010-07-09 19:49:46
【问题描述】:

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

#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;
 }

}

【问题讨论】:

  • 这是你的家庭作业吗?使用宏将字符串转换为大写?真的吗?
  • 无法想象您对define 一个名为UPPER 的宏的奇怪尝试会通过预处理器运行。请只发布可编译的代码。

标签: c


【解决方案1】:

预处理器没有循环。

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

您上面的代码有问题,因为您的宏应该如下所示:

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

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

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

【讨论】:

    【解决方案2】:

    您应该对字符串的每个字符(在循环中)使用 C 标准库函数 toupper()。该函数的优点是可以正确处理非字母字符。

    【讨论】:

    • 我被告知要使用预处理器指令
    • @fahad:这是一个最不寻常的要求。总是有#define my_toupper(x) toupper(x) 的选项。
    • 你的意思是我可以在预处理器中调用内置函数?
    • @fahad:你知道预处理器是做什么的吗?如果没有,你应该查阅你的 C 书。
    【解决方案3】:

    这个家庭作业是教你ascii和类型转换。

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

    提示:char 可以转换为 int。

    【讨论】:

      【解决方案4】:

      如果您假设您正在处理 ASCII,那么您不妨利用字符的布局方式。要转换为大写,请执行c &amp; ~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',但在() 之间是不同的,对于&lt;还有&gt;。然而,仍然可以定义一个无分支(即没有ifs 等)表达式来计算任何给定分隔符的匹配分隔符。

      【讨论】:

        猜你喜欢
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        • 2016-01-22
        • 1970-01-01
        • 2022-01-19
        • 2018-09-07
        • 2014-03-30
        相关资源
        最近更新 更多