【问题标题】:Tips on how to read last 'word' in a character array in C关于如何在 C 中读取字符数组中最后一个“单词”的提示
【发布时间】:2010-10-24 15:08:41
【问题描述】:

只是希望指向正确的方向:

对 C 程序有标准输入,我一次输入每一行并存储在 char[] 中。

现在我有了char[],如何取最后一个单词(假设用空格分隔)然后转换为小写?

我试过了,但它只是挂起程序:

while (sscanf(line, "%s", word) == 1)
    printf("%s\n", word);

接受了建议并想出了这个,有没有更有效的方法来做到这一点?

char* last = strrchr(line, ' ')+1;

while (*last != '\0'){   
    *last = tolower(*last);
    putchar((int)*last);
    last++;
}

【问题讨论】:

  • ;while 的末尾是故意的吗?因为只要你输入输入就会循环......也许按下 Ctrl-D 会让它停止,但我想这不是你想要的。

标签: c scanf stdio fgets


【解决方案1】:

如果我必须这样做,我可能会从strrchr 开始。这应该让你最后一个词的开头。从那里开始,只需遍历字符并转换为小写即可。哦,有一个小细节,您必须先删除所有尾随空格字符。

【讨论】:

  • 谢谢,我已经用我制作的代码编辑了我的问题,这是最好的方法吗?
  • +1。 strrchr 是 精确的答案。还提到小细节很好。 @Igor K:我也不是老手,但我看到的是以下内容:如果答案对您有帮助,那么习惯是投票(对于提问者,接受)答案,而不是更新问题。
  • @ArunSaha,我明白,一旦我收到其他成员的意见,我会接受这是最好的方法。由于我对 C 语言非常缺乏经验,因此如果 @Installer 被证明是其他人最受欢迎的选择,那么接受这个答案而不是说 @Installer 是不明智的。
  • strrchr 不是“最”准确的答案,参见 char *s = " foo bar ";
  • @user411313:你是对的,我认为这就是答案提到的原因:“哦,有一个小细节,你必须先删除任何尾随空格字符。”
【解决方案2】:

您的代码的问题是它会重复将句子的第一个单词读成单词。每次调用它时,它都不会移动到下一个单词。所以如果你有这个作为你的代码:

char * line = "this is a line of text";

然后每次调用 sscanf 时,它都会将“this”加载到 word 中。由于每次读取 1 个单词,sscanf 将总是返回 1。

【讨论】:

    【解决方案3】:

    这会有所帮助:

    char dest[10], source [] = "blah blah blah!" ;
    int sum = 0 , index =0 ;
    while(sscanf(source+(sum+=index),"%s%n",dest,&index)!=-1);
    printf("%s\n",dest) ;
    

    【讨论】:

      【解决方案4】:

      'strtok' 将根据某些定界符拆分输入字符串,在您的情况下,定界符将是一个空格,因此它将返回一个“单词”数组,您只需取最后一个。

      http://www.cplusplus.com/reference/clibrary/cstring/strtok/

      可以说明执行此操作的许多不同方法,然后确定哪种方法具有最佳性能和可用性特征,或者每种方法的优缺点,我只是想用代码 sn-p 来说明我上面提到的内容。

      #include <stdio.h>
      #include <ctype.h>
      #include <stdlib.h>
      #include <string.h>
      #include <conio.h>
      
      int main()
      {
          char line[] = "This is a sentence with a last WoRd ";
      
          char *lastWord = NULL;
          char *token = strtok(line, " ");
          while (token != NULL)
          {
              lastWord = token;
              token = strtok(NULL, " ");      
          }
      
          while (*lastWord)
          {
              printf("%c", tolower(*lastWord++));
          }
      
          _getch();
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 2012-03-21
        • 2021-03-30
        • 1970-01-01
        • 2023-01-30
        相关资源
        最近更新 更多