如何在条件语句中使用ctype. h库?

e5nqia27  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(93)

我正在尝试使用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);
}
gkl3eglg

gkl3eglg1#

正如您已经理解的,*s + i*(s + i)不同,出于可读性的原因,您应该编写s[i]而不是*(s + i)(可读性非常重要)。
所以第一个修正是这样的:

char* cap_string(char* s)
{
  int i;
  char* ps = s;

  for (i = 0; s[i] != '\0'; i++)
  {
    if (isalpha(s[i]) && (isspace(s[i - 1]) || ispunct(s[i - 1])))
    {
      s[i] = toupper(s[i]);
    }
  }
  return (ps);
}

int main()
{
  char test[] = "hello world, abc";
  cap_string(test);
  printf("%s", cap_string(test));
}

但是这段代码仍然有一个问题,如果句子以字母开头(IOW isalpha返回true),你试图访问索引为-1的第一个字母之前的字母 *,访问越界的数组会产生未定义的行为。
因此条件应该是

isalpha(s[i]) && (i == 0 || (isspace(s[i - 1]) || ispunct(s[i - 1])))

因此您永远不会访问s[-1]
IOW:如果第一个字符是字母,我们不需要(也不想)检查前面的字符是否是标点字符的空格。
顺便说一句:char* ps = s;是无用的,你可以只return s;,因为你不改变s

iklwldmw

iklwldmw2#

  1. *s + i不是s[i],而是s[0] + i
    1.即使你用s[i]s[i - 1]纠正了所有出现的*s + i*s + i - 1。如果i是0s[i - 1]将变成s[-1],这是未定义的。

相关问题