我的任务是:
将每个单词的第一个字母大写,其余字母转换为小写。
输入PrOgRaMmInG MeThOd
预期输出Programming Method
我的代码是:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define SIZE 100
void xoa(char s[100], int v)
{
int len = strlen(s);
for (int i = v; i < len; i++)
s[i] = s[i + 1];
s[len - 1] = '\0';
}
void xoakt(char *s)
{
for (int i = 0; i < strlen(s); i++)
if (s[i] == ' ' && s[i + 1] == ' ')
{
xoa(s, i);
i--;
}
if (s[0] == ' ')
xoa(s, 0);
if (s[strlen(s) - 1] == ' ')
xoa(s, strlen(s) - 1);
}
int main()
{
char s[100];
printf("Enter string: ");
fgets(s, 100, stdin);
xoakt(s);
for (int i = 1; i < strlen(s); i++)
{
s[i] = tolower(s[i]);
if (s[i] == " ")
{
break;
for (int j = strlen(s); j >= strlen(s); j--)
{
if (s[j] >= " ")
{
s[j] = tolower(s[j]);
if (s[j] == " ")
{
break;
}
}
}
}
}
printf("%s", s);
return 0;
}
字符串
我的程序输出Programming method
但我需要它输出Programming Method
。
我只是个新手,我不知道该怎么做,请帮帮忙。非常感谢!
7条答案
按热度按时间ecfdbz9o1#
要将 string 转换为 title case,请使用state machine。这里我们需要跟踪前面字符的空格。
只需一次遍历字符串,无需调用
strlen()
。字符串
2nc8po8w2#
你的代码中有很多问题:
xoa
中,如果s
指向空字符串,则s[len - 1] = '\0';
上的行为未定义。xoakt
中,每次迭代时重新计算s
的长度是昂贵的。如果字符串参数为空或仅包含空格,s[strlen(s) - 1]
也会有未定义的行为。main
中,您应该测试fgets()
是否失败,它在文件末尾返回NULL
,并保持s
不变,从而导致未定义的行为,因为s
未初始化。char
tolower
的参数和来自<ctype.h>
的其他函数应该转换为(unsigned char)
,以避免在char
是有符号类型的平台上对负char
值的未定义行为。s[i] == " "
是没有意义的:你正在比较一个char
和一个字符串(一个char *
)。你应该写s[i] == ' '
。for
循环在break
语句之后从不执行。break
语句,for (int j = strlen(s); j >= strlen(s); j--)
将只运行一次,s[j]
是null终止符。s[j] >= " "
和s[j] == " "
是不正确的。您可以使用单个循环来解决此问题,如下面的修改版本所示:
字符串
nhjlsmyf3#
我改变主要功能如下。
字符串
我说的对吗?
我希望我的回答能对你有所帮助。
祝你好运
sf6xfgos4#
你想要的输出被称为标题大小写,这里有一种方法:
可运行代码为here。
字符串
输出量:
型
z9ju0rcb5#
这个应该能用
字符串
6ie5vjzr6#
把大问题分解成小问题会使问题更容易解决。
在这种情况下,我们需要能够解决一些小问题:
每一个都是一个简单的函数。
字符串
一旦我们有了指向每个单词的第一个字母的指针,就很容易忽略这些指针,并将它们指向的字符大写。
型
测试结果:
型
jaql4c8m7#
发布的初始实现没有使用我期望它使用的两个函数,
isspace
和toupper
。这样的功能应该可以工作。
字符串