2016-10-25 21 views
1
#include "stdafx.h" 
#include <iostream> 
#include <iomanip> 
#include <string> using namespace std; 

using namespace std; 

int main() 
{ 
int spaces = 0; 
string input; 
cin >> input; 

for (int x = 0; x < input.length(); x++) { 
    if (input.substr(0, x) == " ") { 
     spaces++; 
    } 
} 
cout << spaces << endl; 
system("pause"); 
return 0; 
} 

Я пытаюсь создать простую программу, которая подсчитывает количество пробелов, добавляя к приращению.Подсчет пробелов с использованием инкремента

Он всегда возвращает 0 по какой-либо причине.

+1

Кстати, я понимаю, что вы просто делаете это, чтобы учиться, но в «реальном» коде вы должны просто использовать ['std :: count'] (http://en.cppreference.com/ж/CPP/алгоритм/кол). Кроме того, пожалуйста, пересмотреть свое использование того, что часто считается плохой практикой: ['using namespace std;'] (http://stackoverflow.com/q/1452721/1171191) и ['endl'] (http: // chris- sharpe.blogspot.co.uk/2016/02/why-you-shouldnt-use-stdendl.html) (это ссылки на объяснения). – BoBTFish

ответ

5

У вас есть две проблемы:

  1. cin >> input; должны быть std::getline(std::cin, input); так std::cin остановится на первом пространстве, а не хранения остальной части строки.
  2. if (input.substr(0, x) == " ") Я не мог понять, что вы подразумеваете под этим выражением. Однако, что вы хотите, это if (input[x] == ' ').

Полный код: (с незначительными изменениями)

#include <iostream> 
#include <iomanip> 
#include <string>  
int main(){ 
    unsigned int spaces = 0; 
    std::string input; 
    std::getline(std::cin, input); 
    for (std::size_t x = 0; x < input.length(); x++) { 
     if (input[x] == ' ') { 
      spaces++; 
     } 
    } 
    std::cout << spaces << std::endl; 
    system("pause"); 
    return 0; 
} 

Online Demo


Как mentioed @BobTFish, правильный способ сделать это в реальном коде:

#include <iostream> 
#include <string> 
#include <algorithm> 
int main(){ 
    std::string input; 
    std::getline(std::cin, input); 
    const auto spaces = std::count(input.cbegin(),input.cend(),' '); 
    std::cout << spaces << std::endl; 
    system("pause"); 
    return 0; 
} 

Online Demo

+1

Я бы написал цикл for как 'for (const auto c: input) {if (c == '') {spaces ++;}}' –

+0

@MartinBonner: Почему? –

+0

@ChristianHackl Потому что он более точно представляет то, что делает цикл for: итерация через каждый символ в строке. Индекс строки не имеет значения. Тот факт, что он короче, является бонусом. –

Смежные вопросы