如何访问内存?

时间:2019-08-27 08:36:18

标签: c string capitalize

我做了一个将小写字母改为大写字母的方法。例如,当我在方法中输入“我爱c语言”时,它将输出“我爱c语言”。

最后,我完成了整个方法,但是有错误。我不知道它为什么无法运行的原因...帮助我..!

我已经在Visual Studio 2019中构建了此代码。

#include <stdio.h>

void LetterCapitalizer(char* str)
{
    const int convertCapital = 32;
    const char emptySpace = ' ';

    str[0] = str[0] + convertCapital;

    for (int i = 0; str[i] != '\0'; ++i)
    {
        if(i == emptySpace)
            str[i+1] = str[i+1] + convertCapital;
    }

    printf("%s", str);
}

int main(void)
{
    LetterCapitalizer("i am a boy");

    return 0;
}

我想在控制台窗口中打印“我是男孩”,但它没有出现。

3 个答案:

答案 0 :(得分:2)

这个带有convertCapital的方法是不可移植的,例如,它在我的机器上不起作用(我必须减去32,而不是加32)。请改用toupper

#include <ctype.h>
....
str[0] = toupper(str[0]);

还有

str[i + 1] = toupper(str[i + 1]);

此外,这里

if(i == emptySpace)

应该是

if(str[i] == emptySpace)

但是关于您的实际问题:"i am a boy"无法修改,但是您可以这样做:

char string[] = "i am a boy";
LetterCapitalizer(string);

或者您可以在LetterCapitalizer函数中重复该字符串:

void LetterCapitalizer(char* str)
{
    char *strCopy = malloc(strlen(str) + 1); // make a mutable copy of the string
    strcpy(strCopy, str);
    const int convertCapital = 32;
    const char emptySpace = ' ';

    strCopy[0] = toupper(strCopy[0]);

    for (int i = 0; strCopy[i] != '\0'; ++i)
    {
        if (strCopy[i] == emptySpace)
            strCopy[i + 1] = toupper(strCopy[i + 1]);
    }
    printf("%s", strCopy);
    free(strCopy); // free the memory again
}

如果需要,可以避免像这样完全分配更多的内存:

void LetterCapitalizer(char* str)
{
    const char emptySpace = ' ';
    putchar(toupper(str[0]));

    for (int i = 1; str[i] != '\0'; ++i)
    {
        putchar(str[i]);
        if (str[i] == emptySpace) {
            putchar(toupper(str[i + 1]));
            i++;
        }   
    }
}

答案 1 :(得分:1)

两个小事情可以改善您的程序:
首先,正如@pmg所说,将LetterCapitalizer("i am a boy");替换为

char tmp[] = "i am a boy";
LetterCapitalizer(tmp);

这将使您不再写read-only字符串。

第二,如果您的字符串中包含space,您将转换下一个角色...。在这种情况下,您可以跳过当前迭代并转到下一个。 br /> 最后,如果您对C函数的调用没有任何限制,则可以使用函数toupper(),该函数将一个卡通人物转换为大写字母!

答案 2 :(得分:0)

您可以使用标志来表示下一个非空格字符将被大写。您可以将结果字符串存储在另一个字符串中。然后返回该结果字符串。我已经更正了代码。如果这对您有帮助,请投票。

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

void LetterCapitalizer(char* str)
{
    const int convertCapital = 32;
    const char emptySpace = ' ';
    bool flag = true;
    char str2[strlen(str)]; 
    for (int i = 0; str[i] != '\0'; ++i)
    {
        if(flag) {
            str2[i] = str[i] - convertCapital;
            flag = false;
        }
        else {
            str2[i] = str[i];
        }
        if(str[i] == emptySpace)
            flag = true;
    }

    printf("%s", str2);
}

int main(void)
{
    LetterCapitalizer("i am a boy");
    return 0;
}