创建我自己的strupr函数,但是不起作用

时间:2018-12-04 06:57:30

标签: c string function

因此,我刚刚创建了自己的toupper(大写一个字符)和strupr(大写一个字符串)。但这是行不通的。所以,这是代码。

#include <stdio.h>

int toupper(const int character) {
    if (character >= 97 && character <= 122)
        return (character - 32);
    return character;
}

char *strupr(const char *string) {
    char *result;
    for (int a = 0; a < strlen(string); a++) {
        *(result + a) = toupper(*(string + a));
    }
    return result;
}

int main() {
    char myString[6] = "Hello";
    printf("myString (Before): \"%s\"\n", myString);
    printf("myString (After): \"%s\"\n", strupr(myString));
    return 0;
}

这是输出:

myString (Before): "Hello"

程序停止后,它仅打印出第一行。所以我需要帮助修复我的代码。

3 个答案:

答案 0 :(得分:1)

您正在尝试访问未初始化的指针结果。这会导致行为不确定:

char * result;
for(int a=0; a<strlen(string); a++)
{
    *result[a] = toupper(string[a]);
}

在访问之前,您需要为该阵列分配足够的内存:

char toupper(const char character)
{
    if(character >= 'a' && character <= 'z')
        return (character + ('A' - 'a'));
    return character;
}

void strupr(const char *string, char *result)
{
    for(int a = 0; a < strlen(string); a++)
        *(result + a) = toupper(*(string + a));
}


int main()
{
    char myString[6] = "Hello", res[6] = {};
    printf("myString (Before): \"%s\"\n", myString);
    strupr(myString, res);
    printf("myString (After): \"%s\"\n", res);
    return 0;
}

或者您可以使用 strupr 的另一个变体,它会更改输入字符串本身:

char* strupr2(char *string)
{
    for(int a = 0; a < strlen(string); a++)
        string[a] = toupper(string[a]);
    return string;
}

int main()
{
    char myString[6] = "Hello", res[6] = {};
    printf("myString (Before): \"%s\"\n", myString);
    printf("myString (After): \"%s\"\n", strupr2(myString));
    return 0;
}

答案 1 :(得分:1)

您尚未为结果分配内存:

char * result;
for(int a=0; a<strlen(string); a++)
{
    *(result+a) = toupper(*(string+a));
}
return result;

因此,当您尝试对其进行写操作时,将调用未定义行为

一个简单的解决方法是在主函数中为结果创建一个固定大小的数组,然后将其传递给函数。


另一种方法是为结果动态分配内存,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int toupper(const int character)
{
    if(character >= 97 && character <= 122)
        return (character - 32);
    return character;
}

char * strupr(const char * string)
{
    char * result = malloc( sizeof(char) * (strlen(string) + 1) );
    if(!result) {
        printf("Malloc failed!\n");
        return "";
    }
    for(unsigned int a=0; a<strlen(string); a++)
    {
        *(result+a) = toupper(*(string+a));
    }
    return result;
}

int main()
{
    char myString[6] = "Hello";
    printf("myString (Before): \"%s\"\n", myString);
    char* res = strupr(myString);
    printf("myString (After): \"%s\"\n", res);
    free(res);
    return 0;
}

但是,如果您采用这种方法,请不要不要忘记释放内存,因为当您不再需要它时(因为此处的其他答案都忘记了释放内存,从而导致内存泄漏) )。


不是错误的原因,但是上层功能的魔幻数字是什么?我建议将它们更改为字符本身(而不是ASCII代码),如下所示:

if(character >= 'a' && character <= 'z')
  return (character - ' ');

答案 2 :(得分:0)

这有效:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * strupr(const char * string)
{
    int a;
    char * result = malloc(strlen(string) + 1);
    for(a=0; a<strlen(string); a++)
    {
        *(result+a) = toupper(*(string+a));
    }
    result[a] = '\0';
    return result;
}

int main(void)
{
    char myString[6] = "Hello";
    char *myStringInCaps;
    myStringInCaps = strupr(myString);
    printf("myString (Before): \"%s\"\n", myString);
    printf("myString (After): \"%s\"\n", myStringInCaps);
    free(myStringInCaps);
    return 0;
}

malloc在堆上分配空间。即使strupr函数返回后,该空间中的位仍保持放置状态。另请注意,\0已添加到字符串的末尾。

理想情况下,应将所有* alloc ed空间都free d,否则可能会导致内存泄漏。但是,在这样的玩具程序中,分配的内存可在程序退出后由OS使用(但永远不要认为这是理所当然的)。