我制作了一个程序,将小写字母转换为大写字母。我知道如何通过预处理程序指令将字符串转换为大写字母,但我不知道如何为字符串执行此操作。
#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;
}
}
答案 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等)表达式来计算任何给定分隔符的匹配分隔符。