如何以简单的方式从 C++ 中的循环中删除最后一个逗号?

How can I remove the last comma from a loop in C++ in a simple way?

此程序用于打印素数直到给定输入并用逗号分隔每个素数。

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,

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

先决条件:

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

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

#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");
}

没必要if then else那么多:

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

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

如果一开始就接受一个额外的space,直接把string换成char,性能会更上一层楼

要轻松删除最后一个逗号,您可以使用 '\b' 字符。

for(auto item : vec)
    std::cout << item << ", " ;
std::cout << "\b\b " << std::endl;

对现有代码进行最少的更改:

#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 语句不会在第一个数字之前打印逗号,但会为每个后续数字打印。