我执行这段代码是为了在不改变c中空格位置的情况下反转输入字符串


#include <stdio.h>
int main()
{
int i, j;
char or[20];
printf("enter your input stringn");
scanf("%[^n]%*c", &or);
for(i=0;i<20;i++)//to get length of string
{
if(or[i]=='')
j=i;
}
char rev[j];//reverse string
for(i=0;i<j ;i++){//inserting spaces into reverse string
if(or[i]==' ')
{
rev[i]=or[i];
}
}
for(i=0;i<j; i++)//inserting characters of original string into reverse string
{
if(or[i]!=' '){
if(rev[j-i]!=' '){
rev[j-i]=or[i];
}
}
}
printf ("%s", rev);//printing reverse string
return 0;
}

在此处输入链接描述

在代码块中,它接受输入,但在显示输出之前进程返回3。代码或IDE中是否需要任何更改?

我的输入是:嗨,伙计我的预期输出是:ed udih但我得到的输出是这样的:输入你的输入字符串

你好伙计

您的算法从一开始就是错误的。

  • 可变长度数组的内容仅在遇到空间时设置;剩余的内容是不确定的,因此任何针对调用未定义行为的评估测试都是不确定
  • 实际冲销存储错误。你正在推进";写";在每次迭代中的位置,即使您跳过了实际的写入。这里需要不同的索引

一个合理的解决方案是:

#include <stdio.h>
#include <string.h>
int main()
{
char or [20];
printf("enter your input stringn");
if (scanf("%19[^n]%*c", or ) == 1)
{
size_t len = strlen(or);
char rev[len+1];//reverse string
for (size_t i = 0; i < len; i++)
rev[i] = (or[i] == ' ') ? ' ' : 0;
rev[len] = 0;
for (size_t i = len, k=0; i-- > 0;)
{
// find next 'write' positon. note this will
//  do nothing if we're already on top of a
//  position ready for storing.
while (rev[k] == ' ')
++k;

// write next char and advance writer index (k)
if (or [i] != ' ') {
rev[k++] = or[i];
}
}
printf("%s", rev);//printing reverse string
}
return 0;
}

输入

one two three four

输出

ruo fee rhtow teno

在这里观看直播

最新更新