C:没有string.h库的字符串函数

时间:2015-05-20 19:35:32

标签: c string

我有功课要做,我需要一些帮助。我没有来这里让别人去做我的工作,只是为了帮助我。

我必须创建自己的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;循环?

5 个答案:

答案 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]);
   } 

这将打印数组中的每个元素,即字符串,