如何以这种简单的方式做反向句子?

时间:2018-02-19 18:02:46

标签: c

我对这段代码有问题,应该做出反向句子。

示例:

输入

Hi my name is Robert

输出

Robert is name my Hi
#include <stdio.h>

#define LEN 50

int main(void)
{
char input, terminator = 0, sentence[LEN+1] = {0};
int i, j, last_space = LEN + 1, posc=0;;
int pos[]={0};

printf("\nEnter a sentence: ");
for (i = 0; (input = getchar()) != '\n'; i++)
{
    if(input== ' '){
        pos[posc]=i;
        posc++;
    }
    if (input == '.' || input == '?' || input == '!')
    {
        last_space = i;
        terminator = input;
        break;
    }

    sentence[i] = input;
}

if (terminator == 0)
{
    printf("Sentence needs a terminating character. (./?/!)\n\n");
    return 0;
}

printf("Reversal of sentence: ");
for (i = last_space; i > 0; i--)
{
    if (sentence[i] == ' ')
    {
        for (j = i + 1; j != last_space; j++)
        {
            putchar(sentence[j]);
        }
        last_space = i;
        putchar(sentence[i]);
    }
}
while (sentence[i] != '\0' && sentence[i] != ' ')
{
    putchar(sentence[i++]);
}
printf("%c\n\n", terminator);
for(int i=sizeof(pos)-1; i>0; i--){
    printf("%.*s", sentence[pos[i-1]], sentence[pos[i]]);
}
printf("%c\n\n", terminator);
return 1;
}

这会因为底部的方法而不断崩溃:

printf("%c\n\n", terminator);
for(int i=sizeof(pos)-1; i>0; i--){
    printf("%.*s", sentence[pos[i-1]], sentence[pos[i]]);
}
printf("%c\n\n", terminator);
return 1;
}

有人可以帮我修复这段代码,以便两种方法在运行时都能正常工作吗?谢谢。

2 个答案:

答案 0 :(得分:1)

大小为1的数组由以下行创建:

int pos[]={0};

稍后您将访问数组的限制:

if(input== ' '){
    pos[posc]=i;
    posc++;
}

此后行为未定义。由于sizeof返回大小(以字节为单位)而不仅仅是元素数量,因此您提到的代码中出现了同样的错误。

答案 1 :(得分:0)

有一种最简单的方法, 你只需要编写一个函数,它将首先写出句子的最后一个单词,然后是第二个单词并继续...

在那里你可以找到一个有效的代码

#include <unistd.h>

//This function print the last word or a space 
static int  print_last(const char *str, int len)
{
    int i = 0;

    while (len > 0 && str[len] == ' ')
        len--;
    while (i <= len && str[len - i] != ' ')
        i++;
    write(1, str + len - i + 1, i);
    while (len > 0 && str[len] == ' ')
        len--;
    if (i < len)
        write(1, " ", 1);
    return (len - i);
}

int     main(int ac, char **av)
{
    int len = 0;
    if (ac == 2)
    {
        while (av[1][len])
            len++;
        len--;
        while (len > 0)
            len = print_last(av[1], len);
    }
    write(1, "\n", 1);
    return (0);
}

然后,一旦编译(编译 - &gt; clang yourFileName.c),你可以像这样调用程序 ./youCompiledProgram 'the sentance you want to be inverted'

example