我做了一个将小写字母改为大写字母的方法。例如,当我在方法中输入“我爱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;
}
我想在控制台窗口中打印“我是男孩”,但它没有出现。
答案 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;
}