遍历C字符串:获取字符串的最后一个字

遍历C字符串:获取字符串的最后一个字,c,string,strncpy,C,String,Strncpy,如何获取字符串的最后一个字,从“\0”换行符到最右边的空格?例如,我可以有这样的东西,其中str可以被分配一个字符串: char str[80]; str = "my cat is yellow"; 我怎样才能变成黄色?类似这样的东西: char *p = strrchr(str, ' '); if (p && *(p + 1)) printf("%s\n", p + 1); 我会使用函数strrchr()实现这一点的最佳方法是利用现有的解决方案。一个这样的解决方案(

如何获取字符串的最后一个字,从“\0”换行符到最右边的空格?例如,我可以有这样的东西,其中str可以被分配一个字符串:

char str[80];
str = "my cat is yellow";
我怎样才能变成黄色?

类似这样的东西:

char *p = strrchr(str, ' ');
if (p && *(p + 1))
    printf("%s\n", p + 1);

我会使用函数strrchr()实现这一点的最佳方法是利用现有的解决方案。一个这样的解决方案(对于一个更普遍的问题)是,一个C的开源正则表达式库。因此,您可以将字符串“my cat is yellow”与正则表达式\b(\w+$)(用C表示为“\b(\w+$”)相匹配,并保留第一个捕获的组,即“yellow”。

(沉重的叹息)标准/K&R/ANSI C中的原始代码是错误的!它不会初始化字符串(名为str的字符数组)!如果这个例子被编译,我会感到惊讶。你的程序段真正需要的是

if strcpy(str, "my cat is yellow")
    {
    /* everything went well, or at least one or more characters were copied. */
    }
或者,如果您承诺不尝试操纵该字符串,则可以在源代码中使用指向硬编码的“my cat is yellow”字符串的字符指针

如前所述,如果一个“单词”由一个空格字符或一个空字符限定,那么声明一个字符指针并在空字符之前从该字符向后走会更快。显然,您首先必须确保有一个非空字符串

#define NO_SPACE 20
#define ZERO_LENGTH -1

int iLen;
char *cPtr;

if (iLen=strlen(str) ) /* get the number of characters in the sting */
    { /* there is at least one character in the string */
    cPtr = (char *)(str + iLen); /* point to the NULL ending the string */
    cPtr--; /* back up one character */
    while (cPtr != str)
        { /* make sure there IS a space in the string
             and that we don't walk too far back! */
        if (' ' == *cPtr)
            { /* found a space */
/* Notice that we put the constant on the left?
   That's insurance; the compiler would complain if we'd typed = instead of == 
 */
            break;
            }
        cPtr--; /* walk back toward the beginning of the string */
        }
    if (cPtr != str)
        { /* found a space */
        /* display the word and exit with the success code */
        printf("The word is '%s'.\n", cPtr + 1);
        exit (0);
        }
    else
        { /* oops.  no space found in the string */
        /* complain and exit with an error code */
        fprintf(STDERR, "No space found.\n");
        exit (NO_SPACE);
        }
    }
else
    { /* zero-length string.  complain and exit with an error code. */
    fprintf(STDERR, "Empty string.\n");
    exit (ZERO_LENGTH);
    }
现在你可以说任何非字母字符都应该标记一个单词边界,比如“狗追猫”或“我的猫:黄色”。那样的话,很容易说

if (!isalpha(*cPtr) )

在循环中,而不是只寻找一个空间…

如果您不想使用'strrchr'函数,下面是解决方案

i = 0;
char *last_word;

while (str[i] != '\0')
{
    if (str[i] <= 32 && str[i + 1] > 32)
        last_word = &str[i + 1];
    i++;
}
i = 0;
while (last_word && last_word[i] > 32)
{
    write(1, &last_word[i], 1);
    i++;
}
i=0;
char*最后一个单词;
while(str[i]!='\0')
{
if(str[i]32)
最后一个单词=&str[i+1];
i++;
}
i=0;
while(last_word&&last_word[i]>32)
{
写(1,&最后一个字[i],1);
i++;
}

可以在初始化过程中完成
+1
char*p=strrchr(str',)+1
@LihO:然后您将检查返回值是否为1(表示未找到)。这不是一个胜利。@LihO谢谢:-)我添加了一些检查,以确保空格不是最后一个字符。如果空格是最后一个字符,那么不应该发生什么坏事,+1指针将指向
'\0'
字符。@Wookie88是的,但可能OP希望避免打印空行:-?无论哪种方式,检查都是可选的。一条规则:如果你不能使用正则表达式,就不要使用它们)没有必要使用正则表达式来处理那些简单的(我认为这是家庭作业)不可编译的代码;非常复杂而且注释过多。包含注释是为了对C语言新手和(在生产环境中)必须维护代码的程序员都有好处。请记住,注释的大小与可执行文件的大小无关。如果您认为代码不可编译,那么您可以随意解释错误。狙击没有任何好处。对于任何正在学习编写代码片段的人来说,它会教给他们坏习惯。(例如,使用printf在标准输出上打印错误);使用任意退出代码;变量名选择不当;while循环的可怕使用;减量的位置不正确(逻辑中的实际语义错误)。然后它实际上并没有绑定到任何类型的函数中,所以代码是不可编译的。对于prod:C程序员理解C;逐行解释代码是一种浪费;简要说明功能即可;如果有一些黑色艺术的东西,大多数QA会拒绝,除非绝对必要。我不是在攻击你,你是在试图帮助,这是非常感谢。我只是指出你的错误,这样你也可以改正。