从字符串中提取字母并转换为大写字母?

时间:2016-01-16 10:36:57

标签: c++

这是一个C ++程序,用于接受所有字符但只输出字母的字符串;如果字母是小写的,那么我们应该把它们做成大写。

#include<iostream>
#include<cstdlib>
#include<cctype>
#include <iomanip>
#include <cstring>

using std :: cin;
using std :: cout;
using std :: endl;
using std::setw ;

const int MAX_STR_LEN=100;

int main()
{
    char str1 [MAX_STR_LEN];
    int i;

    cin >> setw(MAX_STR_LEN) >> str1;

    for (int i=0; i <MAX_STR_LEN; i++) 
    {
        if (isalpha(str1[i])) {
            if (str1[i]>='A'&& str1[i]<= 'Z')
                cout << str1[i]; 
            if (str1[i]>='a'&& str1[i]<= 'z')
            {
                str1[i]= toupper(str1 [i]);
                cout << str1[i]; 
            }
        }
    }
    return EXIT_SUCCESS;
} 

这往往工作正常,但给出了额外的字母,好像我 俯视某事。此外,当我只输入它给出的数字时 像PHUYXPU这样的字母,我没有输入的东西。

3 个答案:

答案 0 :(得分:2)

for (int i=0; i <MAX_STR_LEN; i++)

这意味着您将迭代数组的所有100个单元格,而不管字符串的长度如何。您应该在cin语句之前初始化数组,如:

for(i=0;i<MAX_STR_LEN;i++)
str1[i] = '\0';

或替换for循环中的条件,只迭代数组的长度,如:

for(int i=0;i<strlen(str1);i++) { 
//blah blah blah

答案 1 :(得分:1)

在C ++中,你可以在没有原始循环的情况下做很多事情,试试这个:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

struct to_upper {
    char operator()(char c) { return toupper((unsigned char)c); }
};

int main(int argc, const char * argv[]) {

    string letters, input;
    cout << "Enter your name: ";
    getline(cin, input);

    copy_if(begin(input), end(input), back_inserter(letters), ::isalpha);
    transform(begin(letters), end(letters), begin(letters), to_upper());

    cout << letters << endl;
}

结果:

输入您的姓名:m1ar7ko0
 MARKO

答案 2 :(得分:-1)

如果我做对了你不需要isalpha()函数,你已经删除了数字和符号以及后续的if(str1 [i]&gt; =&#39; A&#39;&amp; ;&amp; str1 [i]&lt; =&#39; Z&#39;)和if(str1 [i]&gt; =&#39; a&#39;&amp;&amp; str1 [i]&lt; =&## 39; Z&#39)