如何简单地在C++循环中去除最后一个逗号?

8

这个程序用于打印出小于给定输入的素数,并用逗号分隔每个素数。

void main(){

    int N, counter=0, isPrime;

    int k, j;

    cout << "Enter maximum range: ";

    cin >> N;

    for (j=2; j<=N; j++){

        isPrime = 0;
        k = 2;

        while (k<j){

            if (j%k==0){

                isPrime++;
            }
            k++;
        }
        if (isPrime==0){

            if (k==N){
                cout << j;
            }
            else{
                cout << j << ",";
            }
            counter++;
        }
    }
    cout << endl;
    system("pause");
}

它只会去掉素数输入的最后一个逗号,而不会去掉其他任何输入的逗号。我该怎么解决这个问题?

Input: 23
Output: 2,3,5,7,11,13,17,19,23
Input: 8
Output: 2,3,5,7,
Input: 9
Output: 2,3,5,7,

1
将逗号添加到上一次迭代而不是当前迭代。然后检查它不是第一次迭代。 - StoryTeller - Unslander Monica
如果你经常这样做,可以使用一个小的辅助类 - sp2danny
6个回答

32

没有必要这么多使用 if then else

std::string delim = "";
for( auto&& item : vec )
{
   std::cout << delim << item;
   delim = ",";
}

对于所有情况,如向量是否为空,都不需要进行检查。

如果您接受在开头有额外的空格,只需将字符串替换为字符,那么性能将得到进一步提升。


5
不要删除最后一个逗号。相反,在每个条目之前插入逗号,第一个除外。

2
为了轻松删除最后一个逗号,您可以使用 '\b' 字符。
for(auto item : vec)
    std::cout << item << ", " ;
std::cout << "\b\b " << std::endl;

1

只需根据预设条件做出决定:

bool first = true;
for(j=2;j<=N;j++){
   // ...
   if(k==N) {
   if(!first) {
       cout << ',';
   }
   else {
       first = false;
   }
   cout<<j;
}

0

最简单的方法是手动输出第一个或最后一个值:

#include <iostream>
#include <cmath>

using namespace std;

int main() {
    int N, counter = 0;
    bool isPrime;

    cout << "Enter maximum range: ";
    cin >> N;
    if (N>=2) {
        cout << "2";
    }
    for (int j = 3; j <= N; ++j) {
        isPrime = true;
        for (int k = 2; k < sqrt(j)+1; ++k) {
            if (j % k == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            cout << ", " << j;
            counter++;
        }
    }
    cout << endl;
    system("pause");
}

0

通过最小化对您现有代码的更改:

#include <iostream>
#include <string>

using namespace std;

void main()
{
    int N, counter = 0, isPrime;
    string separator = ""; // none at first
    int k, j;

    cout << "Enter maximum range: ";

    cin >> N;

    for(j = 2; j <= N; j++)
    {

        isPrime = 0;
        k = 2;

        while(k<j)
        {

            if(j%k == 0)
            {

                isPrime++;

                break; // exit while loop
            }
            k++;
        }
        if(isPrime == 0)
        {
            // if(k==N) not needed
            cout << separator << j;
            separator = ","; // comma after first
            counter++;
        }
    }
    cout << endl;
    system("pause");
}
解释
基本上,我添加了一个分隔符字符串,它在开头是空的,即空字符串,但对于第一个输出之后,它被设置为逗号。因此,cout语句不会在第一个数字之前打印逗号,但会在每个后续要打印的数字之前打印逗号。

你可能想解释一下你在原始代码中做了哪些更改 - 这将使你的答案对他人更有用。谢谢。 - rwp
我在我更改的每一行添加了注释。我认为这很清楚。 - SirKM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接