我正在尝试使用ctype. h库编写一个将字符串中的所有单词都大写的函数。我在条件语句中使用了isalpha(),isspace()和ispunct()函数来检查单词的第一个字母是否是字母表,以及它前面的字符是否是空格或标点符号。如果满足这些条件,则程序使用toupper()函数将字母转换为大写。
我运行了程序,它似乎不工作,它实际上返回了相同的字符串输入。我需要有人来帮助我,这样我就可以学习和提高我的C编程技能。我正在学习C编程在线,我喜欢它。
#include <stdio.h>
#include <ctype.h>
/**
* *cap_string - Capitalize the first words of a string
* @s: Argument pointer to char
* Return: Pointer to s variable
*/
char *cap_string(char *s)
{
int i;
for (i = 0; s[i] != '\0'; i++)
{
if (isalpha(s[i]) && (i == 0 || (isspace(s[i - 1]) || ispunct(s[i - 1]))))
{
*s = toupper(s[i]);
}
}
return (s);
}
/**
* main - Check the code
* Return: Always 0
*/
int main(void)
{
char str[] = "Expect the best. Prepare for the worst. Capitalize on what comes.\nhello world! hello-world 012345
6hello world\thello world.hello world\n";
char *ptr;
ptr = cap_string(str);
printf("%s", ptr);
printf("%s", str);
return (0);
}
2条答案
按热度按时间gkl3eglg1#
正如您已经理解的,
*s + i
与*(s + i)
不同,出于可读性的原因,您应该编写s[i]
而不是*(s + i)
(可读性非常重要)。所以第一个修正是这样的:
但是这段代码仍然有一个问题,如果句子以字母开头(IOW
isalpha
返回true
),你试图访问索引为-1的第一个字母之前的字母 *,访问越界的数组会产生未定义的行为。因此条件应该是
因此您永远不会访问
s[-1]
。IOW:如果第一个字符是字母,我们不需要(也不想)检查前面的字符是否是标点字符的空格。
顺便说一句:
char* ps = s;
是无用的,你可以只return s;
,因为你不改变s
。iklwldmw2#
*s + i
不是s[i]
,而是s[0] + i
。1.即使你用
s[i]
和s[i - 1]
纠正了所有出现的*s + i
和*s + i - 1
。如果i是0
,s[i - 1]
将变成s[-1]
,这是未定义的。