我对这段代码有问题,应该做出反向句子。
示例:
输入
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;
}
有人可以帮我修复这段代码,以便两种方法在运行时都能正常工作吗?谢谢。
答案 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'