C 仅将字符串的第一个字转换为小写

C 仅将字符串的第一个字转换为小写,c,C,我有这个功能 char toLowerCase(char buf[]){ for(int i =0; buf[i]; i++){ buf[i] = tolower(buf[i]); } return *buf; } 结果是什么 INPUT: HELoooO OOOOO RESULT: heloooo ooooo 如何修改它,使其仅将第一个字符串转换为小写,即在“”之后停止 我尝试使用strtok,但它在第一个字符串后返回一个分段错误。buf是一个字符数组。您不能只检查0(您

我有这个功能

char toLowerCase(char buf[]){
  for(int i =0; buf[i]; i++){
    buf[i] = tolower(buf[i]);
  }
 return *buf;
}
结果是什么

INPUT: HELoooO OOOOO
RESULT: heloooo ooooo
如何修改它,使其仅将第一个字符串转换为小写,即在“”之后停止


我尝试使用strtok,但它在第一个字符串后返回一个分段错误。

buf是一个字符数组。您不能只检查0(您当前所做的),还必须检查空白。您可以使用&&运算符执行此操作:

for(int i =0; buf[i] && buf[i] != ' '; i++){

如果buf[i]是一个\0或buf[i]是一个空格,则会触发该条件。

buf是一个字符数组。您不能只检查0(您当前所做的),还必须检查空白。您可以使用&&运算符执行此操作:

for(int i =0; buf[i] && buf[i] != ' '; i++){

如果buf[i]是一个\0或buf[i]是一个空格,则会触发该条件。

只需在第一个空格后退出循环:

for (int i = 0; buf[i] && !isspace(buf[i]); ++i)
  buf[i] = tolower(buf[i]);
ctype.h
中定义,就像
tolower
一样

有些人会争辩说,使用指针会使循环更具可读性,但在技术上是等效的

for (char * s = buf; *s && !isspace(*s); ++s)
  *s = tolower(*s);
如果要跳过前导空格,则需要稍微修改条件

char * s = buf;
for (; *s && isspace(*s); ++s)
  continue;  /* skip leading space */
for (; *s && !isspace(*s); ++s)
  *s = tolower(*s);

只需在第一个空格后退出循环:

for (int i = 0; buf[i] && !isspace(buf[i]); ++i)
  buf[i] = tolower(buf[i]);
ctype.h
中定义,就像
tolower
一样

有些人会争辩说,使用指针会使循环更具可读性,但在技术上是等效的

for (char * s = buf; *s && !isspace(*s); ++s)
  *s = tolower(*s);
如果要跳过前导空格,则需要稍微修改条件

char * s = buf;
for (; *s && isspace(*s); ++s)
  continue;  /* skip leading space */
for (; *s && !isspace(*s); ++s)
  *s = tolower(*s);

只需更改保持for循环运行的条件:

void toLowerCase(char buf[]){
  for(int i =0; buf[i] && buf[i] != ' '; i++){
    buf[i] = tolower(buf[i]);
  }
}

我还删除了返回值,因为您返回的是字符串的第一个字符,我认为这不是您想要的(
*buf
buf[0]
相同)。

只需更改保持for循环运行的条件:

void toLowerCase(char buf[]){
  for(int i =0; buf[i] && buf[i] != ' '; i++){
    buf[i] = tolower(buf[i]);
  }
}

我还删除了返回值,因为您返回的是字符串的第一个字符,我认为这不是您想要的(
*buf
buf[0]
相同)。

哦,我不知道您可以这样做。看看5gon12eders的答案。它比我的好,因为它使用isspace。你可以在循环中检查你想要的任何东西。您甚至不必检查与循环有关的任何内容(即使在大多数情况下,这也是毫无意义和/或不好的做法)。Ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh只要您的字符串不包含空格以外的空格字符(例如制表符),除了
isspace
可能会稍微慢一点之外,没有什么区别。当地点发挥作用时,真正的优势就会显现出来。我更喜欢
isspace
,因为更直接地阅读代码会告诉我它意味着什么。你说得很对,我只是现在没有想到这一点。我会在我的代码中使用它。我不认为它是值得注意的慢,只要你不分析整本书…哦,我不知道你可以这样做。看看5gon12eders的答案。它比我的好,因为它使用isspace。你可以在循环中检查你想要的任何东西。您甚至不必检查与循环有关的任何内容(即使在大多数情况下,这也是毫无意义和/或不好的做法)。Ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh只要您的字符串不包含空格以外的空格字符(例如制表符),除了
isspace
可能会稍微慢一点之外,没有什么区别。当地点发挥作用时,真正的优势就会显现出来。我更喜欢
isspace
,因为更直接地阅读代码会告诉我它意味着什么。你说得很对,我只是现在没有想到这一点。我会在我的代码中使用它。我不认为这是值得注意的慢,只要你不解析整本书。。。