c++ - 在其中,使用空格重新格式化输入的字符串

  显示原文与译文双语对照的内容

目前我正在处理一个问题,将输入的字符串重新格式化为奇数字符,然后连字符都没有。 输入:良好的测试。输出: 转到 etodTs 。由于某些原因,当我运行程序时,它只输出"g"。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>

using namespace std;

int main (int argc, char ** argv) {
 char sWordOdd[100] = {0};
 scanf("%s", sWordOdd);
 int iNum = strlen(sWordOdd);

 for (int i=0; i<=iNum && i%2==0; i++) {
 printf("%c",sWordOdd[i]);
 }
 for (int a=0; a<=iNum && a%2!=0; a++) {
 printf("%c",sWordOdd[a]);
 }
 printf("n");

 return 0;
}

时间: 作者:

你的i<=iNum && i%2==0 中断条件将终止你的循环。 若要达到所需效果,请在循环内放置一个if语句,如下所示:


for (int i = 0; i <= iNum; i++){
 if(i % 2 == 0)
 printf("%c",sWordOdd[i]);
}

至于第二个循环,我认为你是指 a++ 而不是 a--,因为否则你会尝试使用负索引访问 array 。 我想你的意思是让你的循环看起来像这样:


for (int a = 0; a <= iNum; a++){
 if(a % 2!= 0)
 printf("%c",sWordOdd[a]);
}

注意:注意变量和我代码中操作符之间的间隔。 使用这样的空格使你的代码更易于阅读。


int main()
{
 string line;
 getline(cin, line);

 for (size_t start : {0,1})
 for (size_t ii = start; ii <line.size(); ii += 2)
 cout <<line[ii];

 cout <<endl;
}

上面的代码处理任意长的行,是C++11而不是C,并且。

作者:

如前所述,如果 <=iNum && i%2==0是 true ( 对于第一个循环),循环终止,这就是 i=0. 第二个循环以i=1终止。

由于要迭代所有字符,必须将i%2==0部分移出for语句:


for (int i=0; i<=iNum; i++) {
 if (i%2==0)
 {
 printf("%c",sWordOdd[i]);
 }
}

第二个循环需要以同样的方式进行修改。

作者:

要修复这个问题,你必须使用一个在空白后能看到东西的函数。 这个函数叫做 getline 。 但是使用getline时,必须使用字符串,因此在本例中我使用字符串。 然后我用 .size() 函数找到了大小,然后只对question循环使用了一个约束,而不是在问题中。 我还去掉了 char array,并用上面提到的字符串替换它。 其他的一切都是一样的。 使用这个答案,我不必使用 to,也可以简化我的代码,简单易于遵循。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>

#define Set(a, s) memset(a, s, sizeof (a))
#define Rd(r) freopen(r,"r", stdin)
#define Wt(w) freopen(w,"w", stdout)

using namespace std;

int main (int argc, char ** argv)
{
 string sWordOdd;
 getline(cin, sWordOdd, 'n');
 int iNum = (int)sWordOdd.size();

 for (int i=0; i<iNum; i+=2){
 cout <<sWordOdd[i];
 }
 for (int a=1; a<iNum; a+=2){
 cout <<sWordOdd[a];
 }
 printf("n");

 return 0;

}
...