C语言 如何确定每个字符串的最后一个单词?

jqjz2hbq  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(192)

我有这个任务:
从键盘上输入一个句子序列到字符串数组中(输入结束-空字符串)。确定每个句子的最后一个单词。
问题是我的程序输出的是最后一个句子的最后一个单词,而我需要输出每个句子的最后一个单词。
我尝试过的程序:

#include <stdio.h>
#include <string.h>

int main() {
   char str[10][100];
   int i;

   printf("Enter a sequence of sentences:\n");

   for (i = 0; i < 10; i++) {
       if (*gets(str) == '\0')
          break;
   }

   printf("The last word of each of these sentences is:\n");
 
   for (i = 0; i < 10; i++) {
       char *word;
       word = strtok(str[i], ".");
       while (word != NULL) {
           char *last_word = word;
           word = strtok(NULL, ".");
       }
       printf("%s\n", last_word);
   }

   return 0;
}
dgtucam1

dgtucam11#

此调用中的分隔符

word = strtok(str[i], ".");

没有任何意义。
看来你是说

word = strtok(str[i], " \t.");

假设句子只能以点结束并且单词由空格或制表符分隔。
另一个问题是变量last_word必须在while循环之前声明。
例如

char *last_word = NULL;
   char *word;
   word = strtok(str[i], " \t.");
   while (word != NULL) {
       last_word = word;
       word = strtok(NULL, " \t.");
   }

最好使用for循环而不是while循环

char *last_word = NULL;

   for ( char *word = strtok(str[i], " \t." );
         word != NULL;
         word = strtok(NULL, " \t.") ) 
   {
       last_word = word;
   }

注意,函数gets是不安全的,C标准不支持,请改用标准C函数fgets
第二个for循环中的条件

for(i=0; i<10; i++)
{
    char *word;
    //...

不正确,因为用户可以输入少于10个句子。

cczfrluj

cczfrluj2#

没有重复评论的接受答案提供的@Vlad(荣誉!),这里是一个替代提供(与评论)

#include <stdio.h>
#include <string.h>

int main( void ) {
    // A single large buffer allowing very long lines to be entered.
    char buf[ 10 * 100 ], *p = buf;
    size_t left = sizeof buf;
    int i = 0;

    // up to 10 'lines' of input, breaking on an empty line, too
    while( i++ < 10 && fgets( p, left, stdin ) && p[0] != '\n' ) {

        // typical invocation of strtok() to isolate "words"
        // and a "wasteful" copy of each word to the current start of the buffer
        for( char *tkn = p; ( tkn = strtok( tkn, " .\n" ) ) != NULL; tkn = NULL )
            strcpy( p, tkn );

        // having copied the last "word", append '\n' and advance the pointer
        size_t len =  strlen( p );
        p += len;
        strcpy( p++, "\n" );
        left -= len + 1; // eroding the available size of the buffer
    }

    printf( "%s", buf ); // a single output of "word1\nword2\nword3\n..."

    return 0;
}

注意:strcpy()的重叠缓冲区充满了危险。这在这种情况下是有效的,但是在使用这种技术之前必须充分考虑实践及其影响。

相关问题