Ошибка форматирования c ++ с cstrings при использовании tolower - PullRequest
0 голосов
/ 23 апреля 2011

Привет, поэтому я пытаюсь взять cstring и сделать его строчным, но когда я печатаю cstring в конце, я получаю странное поле формата, в котором должны быть некоторые буквы. У кого-нибудь есть идеи?

#include <string>
#include <iostream>
#include <string.h>

using namespace std;

int main () 
{ 
    int i=0; 
    char* str="TEST"; 
    char c; 
    char* cstr = new char[strlen(str) + 1];
    while (str[i]) 
    { 
        c = str[i]; 
        c = tolower(c);
        strcat(cstr, &c); 
        i++; 
    } 

    cout << cstr << endl; 
    return 0; 
}

Ответы [ 4 ]

4 голосов
/ 23 апреля 2011

Проблема в том, что вы звоните strcat неправильно.Второй параметр не является строкой с нулевым символом в конце.

Вам вообще не нужно вызывать strcat.Просто напишите непосредственно в выходную строку:

Попробуйте:

  while (str[i])
  {
    c = str[i];
    c = tolower(c);
    cstr[i] = c;
        i++;
  }
  cstr[i] = 0;

или, что эквивалентно:

while(str[i])
{
  cstr[i] = tolower(str[i]);
  i++;
}
cstr[i] = 0;
1 голос
/ 23 апреля 2011

strcat ожидает нулевое окончание char*, поэтому, присваивая адрес локального char, вы вызываете неопределенное поведение .

Кроме того, new char[std::strlen(str) + 1] не инициализирует массив до 0 s, что означает, что cstr также не будет должным образом завершаться нулем; добавление () к new[] приводит к инициализации массива.

Попробуйте вместо этого:

#include <cstddef>
#include <cctype>
#include <cstring>
#include <ostream>
#include <iostream>

int main()
{
    char const* str = "TEST";
    char c[2] = { };
    char* cstr = new char[std::strlen(str) + 1]();
    std::size_t i = 0;
    while (str[i])
    {
        c[0] = static_cast<char>(std::tolower(str[i++]));
        std::strcat(cstr, c);
    }
    std::cout << cstr << std::endl;
    delete [] cstr;
}
0 голосов
/ 23 апреля 2011
#include <cstddef>
#include <cctype>
#include <cstring>
#include <ostream>
#include <iostream>

#include <string>

int main()
{
    std::string str = "TEST";
    std::string cstr;

    for (std::string::const_iterator it = str.begin(); it!= str.end(); ++it)
        cstr.push_back(tolower(*it));

    std::cout << cstr << std::endl;
}

Или даже короче:

#include <algorithm>
#include <iterator>

...

    std::transform(str.begin(), str.end(), std::back_inserter(cstr), tolower);
0 голосов
/ 23 апреля 2011

Предполагается, что вторым аргументом strcat является строка с нулевым символом в конце, а не адрес одного символа.strcat не подходит для этого использования.

int main ()
{
    const char* str="TEST";
    char* cstr = new char[strlen(str) + 1];
    cstr[strlen(str)] = 0;
    for (int i = 0; str[i]; ++i) {
        cstr[i] = tolower(str[i]);
    }
    cout << cstr << endl;
}
...