我有功课要做,我需要一些帮助。我没有来这里让别人去做我的工作,只是为了帮助我。
我必须创建自己的string.h&#34; library&#34; (实际上是标题和函数文件),所以我禁止使用 #include <string.h>
和#include <ctypes.h>
。他们还建议我们不要使用malloc,但这只是一个建议,不是禁止的。
对于大多数功能,我知道如何编写它们。
我打算保存&#34;字符串&#34;像字符数组一样:
char array[50];
但是我遇到了创建toupper和tolower函数的问题。 当然,如果(如果&#39; s)这样的话,我可以制作大量的开关案例或者很多:
if(string[i]=='a') {string[i]=='A' };
else if(string[i]=='b') {string[i]=='B' };
.
.
.
else if(string[i]=='z') {string[i]=='Z' };
但还有更好的解决方案吗?
字符串将随机创建所以它们看起来会像这样:
ThisISSomESTRing123.
因此在toupper
函数之后,随机生成的字符串应该如下所示:
THISISSOMESTRING123.
另外,如何创建puts
函数(打印),以便所有内容都在同一行?只是&#34; printf&#34;内部&#34; for&#34;循环?
答案 0 :(得分:7)
您的系统可能使用ASCII。在ASCII中,小写字符和大写字符的代码点是顺序的。
所以我们可以这样做:
void to_upper(char *message) {
while (*message) {
if (*message >= 'a' && *message <= 'z')
*message = *message - 'a' + 'A';
message++;
}
}
其他字符编码可能会变得更加复杂。例如,EBCDIC没有连续的字符。由于您需要支持多种语言,UTF-8引入了一系列问题。
答案 1 :(得分:3)
您可以检查角色是否在角色范围内,例如&#39; a&#39;和&#39; z&#39;并且只是加或减32,这是大写和低位字母的ascii值之间的差异。请参阅此处的ascii表:http://www.asciitable.com/
答案 2 :(得分:3)
只做
if (string[i] >= 'a' && string[i] <= 'z') {
string[i] = string[i] - 'a' + 'A';
}
通过将a..z更改为0..26然后将“A”的ASCII值添加到它来将小写转换为大写。
答案 3 :(得分:2)
转换ASCII案例有一个巧妙的技巧。请考虑以下这些字符:
A
- 二进制01000001
a
- 二进制01100001
我们可以看到,差异在第6位,从右边算起。实际上,大写和小写ASCII字符之间的区别是2 ^ 5 = 32.因此,要将字母转换为大写,只需将其与0xDF (11011111)
进行对比即可将该位设置为0。这样您就不会甚至必须检查角色是否已经是大写字母。
请注意,这会破坏高于0x60
的非字母字符,即反引号,{
,|
,}
和~
。但是只要你没有在你的字符串中使用这些,就可以使用它,你可以避免使用if
:)。
注意:只能将其用作此作业的一个很酷的技巧。通常,您应该使用经过适当测试的解决方案(又名string.h
)。
答案 4 :(得分:1)
void toUpper(char *arr) {
while (*arr) {
if (*arr >= 'a' && *arr <= 'z')
*arr = *arr - 'a' + 'A';
arr++;
}
}
使用此函数将字符串中的所有字母变为大写,只需调用toUpper函数,并将数组作为参数即可。 要打印数组,只需使用for循环并移入数组索引元素并打印字母即可。
for(int i=0;arr[i] !='\0';i++)
{
printf("%c",arr[i]);
}
这将打印数组中的每个元素,即字符串,