tolower () в c ++ без использования STL - PullRequest
0 голосов
/ 20 марта 2019

Я хотел написать функцию для tolower () на c ++ без использования STL. Когда я даю небольшие входные данные, такие как «Hello», я получаю правильный вывод с моим кодом, но когда я даю ввод с большими абзацами, в которых есть знаки препинания, я получаю ошибку. Может кто-нибудь помочь исправить и помочь понять, почему я получаю сообщение об ошибке?

Мой код:

#include <iostream>

using namespace std;

int main()
{ 
std::string str[] = ""Mymommaalwayssaid,\"Lifewaslikeaboxofchocolates.Youneverknowwhatyou'regonnaget.""

     int n ,i;
        string UP[str.size()];

        for(int i=0;i<=str.size();i++)
        {
            if(int(str[i])<=90 && int(str[i])>=65)
            { n = int(str[i]);
                n= n+32;
                UP[i]=char(n);
            }

            else 
                UP[i] = str[i];


        }

        cout<<UP<<endl;


    return 0;
}

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Определение, близкое к вашему коду и исправляющее ошибки:

#include <iostream>
#include <string>

using namespace std;

int main()
{ 
  string str = "Mymommaalwayssaid,\"Lifewaslikeaboxofchocolates.Youneverknowwhatyou'regonnaget.";
  string lower = str;

  for (size_t i = 0; i < lower.length(); ++i) // can also use an iterator
  {
    char c = lower[i];

    if ((c >= 'A') && (c <= 'Z'))
      lower[i] += ('a' - 'A');
  }

  cout << lower <<endl;

  return 0;
}

Компиляция и исполнение

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra t.cc
pi@raspberrypi:/tmp $ ./a.out
mymommaalwayssaid,"lifewaslikeaboxofchocolates.youneverknowwhatyou'regonnaget.

Но я не понимаю, потому что вы говорите без использования STL и используете std :: string .

Без std :: string ( iostream можно заменить на stdio.h )

#include <iostream>

using namespace std;

int main()
{ 
  const char str[] = "Mymommaalwayssaid,\"Lifewaslikeaboxofchocolates.Youneverknowwhatyou'regonnaget.";
  char lower[sizeof(str) + 1]; // if str content unknown so sizeof unknown => strlen and new/malloc etc

  for (size_t i = 0 ; i != sizeof(str); ++i)
  {
    char c = str[i];

    if ((c >= 'A') && (c <= 'Z'))
      c += ('a' - 'A');

    lower[i] = c;
  }

  lower[sizeof(str)] = 0;

  cout << lower <<endl;

  return 0;
}

Компиляция и исполнение

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra t.cc
pi@raspberrypi:/tmp $ ./a.out
mymommaalwayssaid,"lifewaslikeaboxofchocolates.youneverknowwhatyou'regonnaget.
0 голосов
/ 20 марта 2019

Ну, у вопроса есть несколько запутанных моментов. Во-первых, вопрос требует примера tolower (), но кажется, что код хочет создать строку с именем UP.

Я пошел дальше и создал функцию string_to_lower (). Я не хотел использовать то же имя, что и tolower (char * str), хотя это сработало бы.

#include <iostream>
#include <string>

std::string string_to_lower(std::string str) {
  const uint diff = 'a' - 'A';  // create a constant from the ascii chars

  std::string lower; // return string.  Could be done with an inline reference.
  lower.reserve(str.length());

  for (int i = 0; i < str.size(); i++) { // Use a ternary to set each char
    lower += (str[i] >= 'A' && str[i] <= 'Z') ? str[i] + diff : str[i];
  }

  return lower;
}

int main()
{
  std::string str = {"My momma always said, \"Life "
                     "is like a box of chocolates."
                     "You never know what you're gonna get.\""};

  std::string lower = string_to_lower(str);
  std::cout << lower << std::endl;
  return 0;
}
...