gpt4 book ai didi

c - 查找并打印带有空格或制表符分隔符的字符串的最后一个单词

转载 作者:行者123 更新时间:2023-11-30 14:41:50 26 4
gpt4 key购买 nike

我正在尝试获取字符串的最后一个单词 argv C 中的参数。如何找到最后一个单词并分隔包含空格/制表符的字符串?

单词的定义是“由空格/制表符或字符串的开头/结尾分隔的字符串部分。”我最初制作了一个函数来识别它是空格还是制表符;但是,我的解决方案并不适用于所有情况。大部分都有效,但是当我的 argv有一个类似 "asdkBakjsdhf1785 " 的字符串,预期输出应该是 "asdkBakjsdhf1785" ,不是"asdkBakjsdhf1785 " 。所有这些功能都必须从头开始,我只能使用 write函数来自 <unistd.h>图书馆。

int my_isspace(char c)
{
if (c == ' ' || c == '\t')
return (1);
return (0);
}

void my_putstr(char *str)
{
while (*str)
write(1, str++, 1);
}

void last_word(char *str)
{
char *last;
int i;

i = 0;
last = &str[i];
while (str[i])
{
if (my_isspace(str[i]))
{
if (str[i + 1] >= '!' && str[i + 1] <= '~')
last = &str[i + 1];
}
i++;
}
if (last)
my_putstr(last);
}

int main(int argc, char *argv[])
{
if (argc == 2)
last_word(argv[1]);
my_putstr("\n");
return (0);
}

现在,它所做的是解析字符串并检查它是否有空格/制表符。如果有,它将忽略它并移动到下一个字符,直到遇到 ! 之间的字符。和~ (包括那些)。一旦它命中中间的任何字符,它就会将解析存储到另一个空字符串指针中,以保留“最后一个单词”。按照我使用的方式,我可以在哪里改进一点点来在末尾分隔我的空格/制表符?

最佳答案

您有几个问题。首先,它有助于使您的 my_isspace() 大致相当于 isspace() ,以便它正确地将行结束视为空格,例如

int my_isspace (const char c)
{
if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
return 1;

return 0;
}

接下来,您可以通过采用状态循环方法并保留一个简单的标志来帮助您使last_word()(以及许多其他类似的分类函数)变得更加简单你的分类。例如在这里,它有助于了解您是否在单词内阅读。这有助于实现简单的输入/输出状态,您可以使用简单的 int in = 0; 标志(对于单词外部)和 in = 1; 来跟踪该状态一句话。

将其投入使用,对于可变字符串,您的 last_word() 可以编写如下(main() 的参数是可变的):

void last_word (char *str)
{
char *p = NULL, /* your last */
*ep = NULL; /* end pointer to end of last */
int in = 0; /* flag - in/out of a word */

while (*str) { /* loop over each char */
if (my_isspace (*str)) { /* if a space */
if (in) /* if in a word */
ep = str; /* set endptr to current char */
in = 0; /* set out of word */
}
else { /* not a space */
if (!in) /* if not in a word */
p = str; /* set start pointer */
in = 1; /* set in word */
}
str++; /* increment pointer */
}

if (p) { /* if we have start of word */
if (ep) /* if we have endptr set */
*ep = 0; /* nul-terminate at endptr */
my_putstr (p); /* output last */
}
}

(注意:如果处理非可变字符串输入,可以使用ep - p获取要输出的字符数并一次输出一个)

一个完整的示例(带有一些清理)可能是:

#include <unistd.h>

int my_isspace (const char c)
{
if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
return 1;

return 0;
}

void my_putstr (const char *str)
{
size_t n = 0;

for (n = 0; str[n]; n++) {}

write (1, str, n);
}

void last_word (char *str)
{
char *p = NULL, /* your last */
*ep = NULL; /* end pointer to end of last */
int in = 0; /* flag - in/out of a word */

while (*str) { /* loop over each char */
if (my_isspace (*str)) { /* if a space */
if (in) /* if in a word */
ep = str; /* set endptr to current char */
in = 0; /* set out of word */
}
else { /* not a space */
if (!in) /* if not in a word */
p = str; /* set start pointer */
in = 1; /* set in word */
}
str++; /* increment pointer */
}

if (p) { /* if we have start of word */
if (ep) /* if we have endptr set */
*ep = 0; /* nul-terminate at endptr */
my_putstr (p); /* output last */
}
}

int main (int argc, char **argv) {

my_putstr ("'");
if (argc >= 2)
last_word (argv[1]);
my_putstr ("'");
my_putstr ("\n");

return 0;
}

示例使用/输出

单个词:

$ ./bin/write_last_argv1 "fleas"
'fleas'

带有尾随空格的单个单词:

$ ./bin/write_last_argv1 "fleas      "
'fleas'

多个单词:

$ ./bin/write_last_argv1 "my dog has fleas"
'fleas'

带有前导、尾随和多个中间空格的多个单词:

$ ./bin/write_last_argv1 "  my    dog  has fleas   "
'fleas'

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 查找并打印带有空格或制表符分隔符的字符串的最后一个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54729288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com