我制作了一个程序,将小写字符串转换为大写字母,如strupr();在strings.h ..当我运行程序时打印一些ascii代码
#include<stdio.h>
#include<conio.h>
void xstrupr(char string[]);
void main(void)
{
char string[40];
puts("Enter string:");
gets(string);
xstrupr(string);
printf(" %s ",string);
getch();
}
void xstrupr(char string[])
{
int i;
for(i=0;;i++)
{
if ((string[i]>='a')&&(string[i]<='z') )
string[i]+=64;
else
if(string[i]=='\0')
break;
}
}
答案 0 :(得分:8)
如果你不介意我这么说,这太可怕了。当然不要亲自接受这个。
char
变量用作循环索引;它们通常太小了。islower()
检查字符是否为小写。toupper()
将其转换为大写字母。我建议的这种风格的实现方式是:
#include <ctype.h>
void xstrup(char *string)
{
for(; *string; string++)
*string = toupper((unsigned char) *string);
}
请注意,这只是一个合理的(在我看来)实现它想要实现的目标,它绝不是完美的,也不能解决我的所有抱怨。
答案 1 :(得分:2)
您正在返回一个整数(0或i-64
)并将其视为指向空终止字符串的指针。打印垃圾我并不感到惊讶。
答案 2 :(得分:2)
实际上在ASCII图表范围内如下:
您编辑的程序就是这样:
#include<stdio.h>
#include<conio.h>
void xstrupr(char string[]);
void main(void)
{
char string[40];
puts("Enter string:");
gets(string);
xstrupr(string);
printf(" %s ",string);
getch();
}
void xstrupr(char string[])
{
int i;
for(i=0;;i++)
{
if ((string[i]>='a')&&(string[i]<='z') )
string[i]-=32;
else
if(string[i]=='\0')
break;
}
}
请参阅下面的ascii表:
ASCII Table http://www.unitechnical.info/Products/ASCII-Chart.jpg
答案 3 :(得分:1)
当遇到小写字符时,该函数退出,而不是取代当前字符。
strupr()
返回的类型也是错误的,它不应该是char。并且它不会返回正确的东西。所以它肯定会输出垃圾。
[我不会给你所有细节,因为你似乎是学习,随时可以要求更多]。
答案 4 :(得分:1)
首先,大写和小写字母之间的ASCII值差异为32,而不是64。
其次,最重要的是,C库提供了tolower()和toupper()函数,这些函数不仅适用于ASCII,而且适用于您当前使用的任何编码。
答案 5 :(得分:1)
在我看来,你正试图在最基本的层面上做到这一点。话虽如此,你做出了一个错误的假设。
您不会通过向其添加64来获得字母的大写版本。此外,仅提供幻数不清楚,并且在另一个字符集上可能是错误的。
尝试将string[i] += 64;
更改为string[i] += 'A' - 'a';
。这将适用于所有字符集,其中大写和小写字母之间存在恒定的差异。
现在,在某些情况下会失败。例如,在EBCDIC中,字母不是连续的,因此从“a”到“z”的范围不是全部字母。这就是为什么在实际代码中,您使用isalpha()
和toupper()
等标准功能,但这可以作为练习。
答案 6 :(得分:0)