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

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

#include #include #include #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 TOUPPER(x) x = (x>='a' && x<='z')?(x-32):x; 

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

但我不明白宏观的重点是什么。

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

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

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

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

如果你假设你正在处理ASCII,那么你也可以利用字符的布局方式。 要转换为大写,请执行c & ~0x20 。 要转换为小写,请执行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 ,尤其是靠近末尾的hex表。 它清楚地显示了不同角色之间的关系。 有一些不错的模式,但我怀疑,由于历史原因,有一些不幸的不一致。 例如,要在[]{}之间进行转换,您可以只执行’c ^ 0x6’,但在()之间它是不同的,并且它与<>不同。 但是,仍然可以定义一个无分支(即不是s等)表达式来计算任何给定分隔符的匹配分隔符。