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

如何使用数组将C中的句子拆分成单词,c,arrays,char,C,Arrays,Char,我正在写一个程序,把文本分成几个句子。 输入: 输出: Hi, my name is John. 代码 如果您尝试运行或可以看到,则会出现错误。它不输出最后一个字 我试着把这个循环放在那里: do { if (str[i] == ' ') { printf("\n"); k=i-lenght; do { putchar(str[k]); k++; }while(str[k] != ' '); le

我正在写一个程序,把文本分成几个句子。
输入:

输出:

Hi,

my

name

is

John.
代码

如果您尝试运行或可以看到,则会出现错误。它不输出最后一个字

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

  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 cycle,而不是do while cycle(在代码的“if”部分):

让我吃惊的是,这个函数只“输出”句子中的第一个单词。如果第一个单词是“John”,则输出“John”“ohn”“hn”

所以这里不仅仅有一个问题

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

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


请不要因为代码而责备我,我只是想学点东西。我知道这不是杰作,我可以而且我会在完成之前把它缩短。

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

您可以更改for循环条件以查找终止的'\0',这将修复它。

\include
#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;
}
int main() { char-str[200]; int i=0; 放入(“输入文本:”); 获取(str); int k,长度=0; printf(“因此单词是:\n”); while(str[i]!='\0') { 如果(str[i]=''){ k=i-长度; 做{ putchar(str[k]); k++; }while(str[k]!=“”); printf(“\n”); 长度=(-1); } else if(str[i+1]='\0'){ k=i-长度; 做{ putchar(str[k]); k++; }while(str[k]!='\0'); 长度=0; } 长度++; i++; } 返回0; }
请正确设置代码格式。是否有理由使用“.”而不是“\0”作为短语终止符?如果你最后没有一个“.”,这将永远不会停止。只是一个提示。@HugoSadok我试过了,但失败了。。。我将不得不使用它,我知道。。。但首先,我想找出这个问题。@StevenWalton哇,谢谢,我将看一看,将支票从“.”更改为“\0”应该可以解决它。但是如果你想一想,它还是很难看的。但我同意,考虑到代码,这可能是最简单的修复方法。它只在第一个单词中打印Frist字母。@Tehryn我指的是代码的第一个版本only@well我知道。。。当我更改它时,它会打印整个句子,但evan带有空字符,或者至少是点后面的一些随机字符。但是如果我放在那里:
if(请解释你的答案
void word (char *c,int index, int lenght ) {
   printf ("\n");
   int i = index - lenght;
    do {
        putchar (c[i]);
        i++;
    } while (c[i] != ' ');
    return;
}
for (i=0; str[i] != '.'; i++) {
    if (str[i] == ' ' || str[i] == '.') {
    word(str, i, lenght);
    lenght = 0;
    }

    lenght++;
  }
#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;
}