如何在C中使用数组将句子分成单词

问题描述 投票:0回答:2

我正在尝试编写程序,它将文本分成句子。
输入:

Hi, my name is John.

输出:

Hi,

my

name

is

John.

代码

int main ()
{
  int str[200]; 
  int i = 0;
  puts ("Enter text. Do not forget to put dot at the end.");
  do {
    str[i] = getchar();
    i++;
  } while (str[i-1] != '.');

  printf("\n");
  int k, lenght = 0; //lenght -- the lenght of single word

  for (i=0; str[i] != '.'; i++) {
    if (str[i] == ' ' || str[i] == '.') {
    printf ("\n");
    k = i - lenght;

    do {
        putchar (str[k]);
        k++;
    } while (str[k] != ' ');
    lenght = 0;
    }

    lenght++;
  }

  printf ("\n stop");
  return 0;
}

如果您尝试运行或者可以看到,则存在错误。它不输出最后一个单词。

我尝试把这个循环放在那里:

  do  {
    if (str[i] == ' ') {
    printf("\n");
    k=i-lenght;
    do {
        putchar(str[k]);
        k++;

    }while(str[k] != ' ');

    lenght=0;

    }

    lenght++;
    i++;
  }while(str[i+1] != '.');

但它是同一个循环...我也尝试过制作函数:

void word (char *c,int index, int lenght ) {
   printf ("\n");
   int i = index - lenght;
    do {
        putchar (c[i]);
        i++;
    } while (c[i] != ' ');
    return;
}

我调用它而不是 do-while 循环(在代码的“if 部分”):

for (i=0; str[i] != '.'; i++) {
    if (str[i] == ' ' || str[i] == '.') {
    word(str, i, lenght);
    lenght = 0;
    }

    lenght++;
  }

令我惊讶的是,该函数仅“输出”句子中的第一个单词。如果第一个单词是“John”,则输出“John”“ohn”“hn”。

所以不只有一个问题...

如何重新制作/修复循环/函数以输出我想要的内容 - 句子中的所有单词?

为什么它不起作用?我知道答案 - 因为你的循环是以字符“ ”结束的,而不是以“.”结束,但是当我尝试更改它时,它在点后又输出了一个随机字符.

请不要因为代码而责怪我,我只是想学习一些东西的初学者。我知道它不是杰作,但我可以并且在完成之前我会缩短它。

c arrays char
2个回答
2
投票

它不打印最后一个单词的原因是,一旦它读取并找到“.”,for循环就会终止,因此它不会处理和输出该单词。

您可以更改 for 循环条件以查找终止“ ”,这应该可以修复它。


1
投票
#include<stdio.h>
int main () {
    char str[200];
    int i = 0;
    puts ("Enter text:");

    gets(str);

    int k, length = 0; 
    printf("So the words are:\n");
    while(str[i]!='\0') {
    
        if (str[i] == ' ') {
            k = i - length;

            do {
                putchar (str[k]);
                k++;
            } while (str[k] != ' ');
            printf ("\n");
            length = (-1);
        }
        else if (str[i+1] == '\0') {
            k = i - length;

            do {
                putchar (str[k]);
                k++;
            } while (str[k] != '\0');
            length = 0;
        }

        length++;
        i++;
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.