2016-04-14 32 views
0

我有一个问题,我的代码不能够大写第一个字符串后的任何字符串的第一个字母,并且不显示字符串的最后一个字。该代码使用linux重定向从输入文件中读取一系列标题。每个单词的第一个字母需要大写,其余的都是小写,每个单词需要用一个黑色空格分隔。这是测试数据的输出:隐形字符出现在字符串的新行

The 5th 
the Cat In The 
one Fish Two Fish Red Fish Blue 

还要注意如何存在和第5和鱼和红之间的两个空格

#include <iostream> 
#include <iomanip> 
#include <cctype> 
#include <string> 
using namespace std; 

void reform (string& imup); 
int main() 
{ 
    string word; 
    string temp = " "; 
    string letters; 
    getline(cin,letters); 
    int length; 
    length = 0; 
    word = ""; 
    while (cin) 
    { 
     length = letters.size(); 
     for (int i =0; i < length; i++) 
     { 

      if (letters[i] != ' ' && letters[i] != '\n') 
      { 
       word = word + letters[i]; 
      } 
      else if ((letters[i] == ' ' && isalpha(letters[i-1])) || 
        (letters[i] == ' ' && isalpha(letters[i+1]))) 
      { 
       reform(word); 
       cout<< word <<" " ; 
       word = ""; 
      } 
      else if ((letters[i] == ' ' && isdigit(letters[i-1])) || 
        (letters[i] == ' ' && isdigit(letters[i+1]))) 
      { 
       reform(word); 
       cout<< word <<" " ; 
       word = ""; 
      } 

     } 
     cout<< endl; 
     getline(cin,letters); 
    } 

    return 0; 
} 


void reform (string& imup) 
{ 
    int size; 
    // cout <<"hi "; 
    size = imup.length(); 
    imup[0] = toupper(imup[0]); 
    for (int i=1; i < size; i++) 
     imup[i] = tolower(imup[i]); 
} 
+1

请编辑您的帖子,并正确缩进代码。随机缩进使得其逻辑难以遵循。 –

+0

(不相关)使用'while(getline(..))'而不是两次调用'getline'。 –

+0

您可以将isalpha和isdigit的测试合并到||中。 (这样你就不需要重复合并)。如果一行的第一个字符是空格,这将炸毁。如果空格之前的字符既不是字母也不是数字(如$,@或*),会发生什么情况。 –

回答

0

鉴于a__b作为输入(带下划线代表一个空白),这会在a后面的空白处识别单词结尾,打印a_。然后,它将在b之前的空白处检测字尾,因为字是空的,所以打印_

我不知道你为什么看后的一个空格。在检查前一个角色之前,你还应该确保我不是0。

为什么不直接输出单词,如果它在输入空白或输入结束时是非空的?

是这样的:

while (getline(cin, letters)) { 
    bool first = true; 
    string word; 
    for (string::const_iterator s = letters.begin(); s != letters.end(); ++s) { 
    if (*s == ' ' || *s == '\r' || *s == '\n') { 
     if (!word.empty()) { 
     if (!first) cout << ' '; 
     reform(word); 
     cout << word; 
     word = ""; 
     first = false; 
     } 
    } 
    else 
     word += *s; 
    } 
    if (!word.empty()) { 
    if (!first) cout << ' '; 
    reform(word); 
    cout << word; 
    } 
    cout << endl; 
} 

第一标志,那么避免了印刷的后空白上的线。

+0

我不确定你的意思,你能提供一个例子吗?谢谢 – yasky

+0

1.剥离换行符(如果存在)。然后'for(char l:letters)if(c!='')word + = l; else if(word.size()> 0){output word}; if(word.size()!= 0 {output word}; cout << endl;'(第二个if在for循环之外) –

+0

您可能需要将“if(!word.empty())”和相关代码合并成一个小函数 –

0

这是我的版本代码的(你可以用迭代器取代循环):

#include <iostream> 
#include <iomanip> 
#include <cctype> 
#include <string> 
using namespace std; 

int main() 
{ 
     string word; 
     string temp = " "; 
     string letters; 
     int i, len; 
     while(getline(cin,letters)) 
     { 
      len = letters.size(); 
      for(i = 0; (i < len) && isspace(letters[i]); i++) 
       ; 
      if(i >= len) 
       cout << "Empty line is entered" << endl; 
      else 
      { 
       string out_string = letters.substr(i); 
       out_string.replace(0, 1, 1, std::toupper(out_string[0])); 
       for(i = 1; i < len; i++) 
        out_string.replace(i, 1, 1, std::tolower(out_string[i])); 
       cout << out_string << endl; 
      } 
     } 
    }