0

文字を使用して文字列をすべて小文字に変換し、文字列内の各文字を反復処理する単純な関数を c++ で作成しました。コンソール ウィンドウでこのプログラムを実行すると、関数が cout を参照しない場合、元の入力に加えて出力が得られる理由を説明してください。

#include <iostream>
#include <cctype>
#include <cstdlib>
using namespace std;
string makelower(string text)
{
    int iter = 0;
    char cha;
    string newtext;
    while (iter < text.length())
    {
        cha = text[iter];
        cha = tolower(cha);
        newtext+=cha;
        iter++;
    }
    return(newtext);
}

int main()
{
    string a;
    cin>>a;
    a = makelower(a);
    cout<<a;
}
4

3 に答える 3

1

コードには多くの問題があります。おそらく最も重大な問題は、小文字に変換することによって何を意味するのかを定義していないことです。それはいつも見かけほど明白ではありません。でも:

  • 文字列内の文字を反復処理するには、反復子を使用し、最後をテストします。C++11 では、範囲ベースのループを使用できます。

  • の単一引数形式の引数は、0 から;tolowerの間の値でなければなりません。UCHAR_MAXがある場合char、これは通常、 に変換することで実現されunsigned charます。

  • 文字列を返したい場合は、変換時に文字を追加する必要があります。makelowerまたは、非 const 参照を取得することで、その場で変更を行うことができます。私は前者をお勧めします。

これらすべてを考慮して:

std::string
makeLower( std::string const& original )
{
    std::string results;
    for ( unsigned char ch : text ) {
        results += std::tolower( ch );
    }
    return results;
}

この関数を使用するには、文字列で呼び出し、その結果で別の文字列を初期化するか、文字列に代入します。または、文字列が必要な式で使用します。

std::string line;
while ( std::getline( std::cin, a ) && !line.empty() ) {
    std::cout << makeLower( a ) << std::endl;
}
于 2014-12-02T23:39:30.403 に答える
0

putchar関数puts は、割り当てられた文字を に出力しstdoutます。これに関する追加情報はこちらにあります。代わりにtolower、次のことを行う必要がありますchar

string makelower(string text)
{
    int iter = 0;
    char cha;
    while (text[iter])
    {
        tolower(text[iter]);
        iter++;
    }
return(text);
}

完全なプログラムを次のように作成します (コードをより効率的にしました):

#include "stdafx.h"
#include <iostream>
#include <ctype.h>
#include <string>
#include <cstdlib>
using namespace std;

string makelower(string text)
{
    int iter = 0;
    while (text[iter])
    {
        tolower(text[iter]);
        iter++;
    }
    return(text);
}

int main()
{
    string a;
    cin >> a;
    a = makelower(a);
    cin >> a;
}

適切にテストしたときにコードのコンパイルを停止する#include <string>が見つからなかったので、追加しました。すでにある場合は削除します。

于 2014-12-02T23:23:55.707 に答える