Пытаюсь взять новую пластину на машину и поменять старую. Мне нужно, чтобы три буквы были заглавными. Дело в том, что я не могу передать "заглавный" элемент массива newPlate в массив new_Plate. Программа компилируется, но иногда ответ -% ^ & #% @ $, а иногда - ничего. Я знаю, что у меня проблема с указателями.

void Car::set(char *newBrand, char *newPlate) 
{
    char new_Brand[80];
    char new_Plate[8];

    if(strlen(newPlate)==8)
    {
        for(int i=0;i<3;i++)
        {   
            if(65<=(int)newPlate[i]<=90)
            {
                new_Plate[i]=newPlate[i]; // probably the problem
            }

            if(97<=(int)newPlate[i]<=122)
            {
                new_Plate[i]=(newPlate[i]+32); // probably the problem
            }

            cout<<new_Plate;
        }
    }
}
0
Occlet 25 Ноя 2016 в 16:56

2 ответа

Лучший ответ

Ваша строка new_Plate не включает нулевой терминатор. Кроме того, 65<=(int)newPlate[i]<=90) недопустим в C ++. Вы должны написать что-то вроде

'A'<=newPlate[i] && newPlate[i]<='Z')
2
Andrea Bergia 25 Ноя 2016 в 14:01

Проблема с выражением 65<=(int)newPlate[i]<=90 ( не считая нечитаемого, используйте больше пробелов, чтобы сделать его более читабельным ) в том, что оно означает ((65 <= (int) newPlate[i])) <= 90, что не является тем, что математически кажется жадный.

Это выражение ВСЕГДА будет истинным, потому что 65 <= (int) newPlate[i] будет оценивать либо 1, либо 0, и, конечно, всегда будет < 90.

Кроме того, чтобы сделать код еще более читабельным, используйте 'A' вместо 65 и эквивалент для любого другого символа. Большинство программистов знают, что 'A' в ascii равно 65, но вы заставляете их останавливаться на одну или две секунды, чтобы понять, что вы действительно имеете в виду 'A'!

Кроме того, вы должны завершать c-строки с помощью '\0', чтобы вам понадобился один дополнительный символ в конце, иначе cout << new_Plate вызовет неопределенное поведение.

Чтобы напечатать строки c, библиотека будет выводить символы из входного буфера до тех пор, пока не найдет '\0', поскольку его нет в вашем буфере, и нет предсказуемого способа его распечатать.

Проверьте это, вы понимаете изменения?

#include <iostream>
#include <cstring>

using namespace std;

class Car {
public:
    Car();
    void set(const char *const newBrand, const char *const newPlate);
};

Car::Car() 
{
}


void
Car::set(const char *const newBrand, const char *const newPlate) 
{
    char new_Brand[80];
    char new_Plate[9];
    size_t length;
    size_t i;

    (void) new_Brand;
    length = strlen(newPlate);
    for (i = 0 ; ((i < length) && (i < sizeof(new_Plate) - 1)) ; ++i) {   
        if (('A' <= newPlate[i]) && (newPlate[i] <= 'Z')) {
            new_Plate[i] = newPlate[i];
        } else if (('a' <= newPlate[i]) && (newPlate[i] <= 'z')) {
            new_Plate[i] = (newPlate[i] - 32);
        }
    }
    new_Plate[i] = '\0';

    cout << '*' << new_Plate << '*' << endl;
}

int
main(void)
{
    Car car;    
    car.set("audi", "example text");
    return 0;
}
2
Iharob Al Asimi 25 Ноя 2016 в 16:24