目前我正在研究一个问题,即将输入的字符串重新格式化为奇数字符,然后将字符重新格式化为没有换行符。恩。输入:良好的测试。输出:Go 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;
}
答案 0 :(得分:0)
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,并且有效。
答案 1 :(得分:0)
您的i<=iNum && i%2==0
中断条件会提前终止您的循环。为了达到你想要的效果,在循环中放入一个if语句,如下所示:
for (int i = 0; i <= iNum; i++){
if(i % 2 == 0)
printf("%c",sWordOdd[i]);
}
至于你的第二个循环,我认为你的意思是a++
而不是a--
,因为否则你会尝试使用负索引来访问数组。我认为你的循环看起来像这样:
for (int a = 0; a <= iNum; a++){
if(a % 2 != 0)
printf("%c",sWordOdd[a]);
}
附注:注意我的代码中变量和运算符之间的间距。使用这样的空格可以使您的代码更容易阅读。
答案 2 :(得分:0)
如前所述,如果i&lt; = iNum&amp;&amp; i%2 == 0为真(对于第一个循环),这是i = 0的情况。第二个循环以i = 1结束。
由于你想要迭代所有字符,你必须将i%2 == 0部分移出for语句:
for (int i=0; i<=iNum; i++) {
if (i%2==0)
{
printf("%c",sWordOdd[i]);
}
}
第二个循环需要以相同的方式修改......
答案 3 :(得分:0)
要解决此问题,您必须使用可以在空白后查看内容的函数。此函数称为getline。但是使用getline,你必须使用字符串,所以在这个例子中我使用了字符串。然后我找到了.size()
函数的大小,然后在for循环中使用了一个约束而不是问题中的两个约束。我也脱掉了char数组,并用如上所述的字符串替换它。其他一切都差不多了。使用这个答案让我不必使用cstring,也可以简化我的代码,简单易用。
#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;
}
&#13;