Другой вывод C++ на ARM

Я изучаю С++. У меня есть чип MacBook Pro M1PRO и Asus с i5 8-го поколения с Fedora 39.

Я немного знаю Java, поэтому в своем проекте Hello World я пытался воссоздать функции разделения и обрезки, но на C+, однако я нашел кое-что весьма загадочное.

я использую следующие команды для компиляции на обеих машинах: g++ -std=c++20 -o hello main.cpp

код:

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;


string vector_to_string(const vector<string>& v, const string& separator = "") {
    string result = "[";
    for (size_t i = 0; i < v.size(); ++i) {
        result += v[i];
        if (i < v.size() - 1) {
            result += separator;
        }
    }
    result += "]";
    return result;
}

string trim(const string& input) {
    if (input.empty()) {
        return "";
    }

    constexpr char SPACE = ' ';
    const size_t first_index = input.find_first_not_of(&SPACE);
    if (first_index == string::npos) {
        return "";
    }
    const size_t last_index = input.find_last_not_of(&SPACE);

    return input.substr(first_index, last_index - first_index + 1);
}

vector<string> split(const string& input, const char delimiter) {
    vector<string> tokens;

    size_t last_start = 0;
    for(size_t i = 0; i < input.length(); i++) {
        if (input[i] == delimiter) {
            string token = trim(input.substr(last_start, i - last_start));
            if (!token.empty()) {
                tokens.push_back(token);
            }
            last_start = i + 1;
        }
    }
    string lastToken = trim(input.substr(last_start));
    if (!lastToken.empty()) {
        tokens.push_back(lastToken);
    }

    return tokens;
}

int main() {
    const string input = "Hello world";
    const vector<string> tokens = split(input, ' ');
    cout << vector_to_string(tokens, ", ") << endl;
    return 0;
    
}

Итак, я ожидаю вывода [Hello, world], и это действительно происходит на моей машине с Linux. Но на Mac каждый раз, когда я выполняю свою программу вывода, я получаю либо правильное [Hello, world], либо неправильное [Hell, world].

Возможно, это адский мир, но мне бы очень хотелось понять, почему это происходит. Я думаю, что что-то не так с компилятором на моем Mac или ARM работает странно, но я в этом сомневаюсь.

Кроме того, пожалуйста, не стесняйтесь исправлять мой код и судить меня, это помогает мне учиться.

Спасибо!

Попробовал переключить процессор на Intel, все работает нормально. Пробовал гуглить, ничего конкретного не нашел. Пытался спросить

Почему вы используете &SPACE?

Eljay 29.02.2024 22:47
find_first_not_of и find_last_not_of нужен параметр массива символов, разделенный NUL. Вы предоставляете только один символ SPACE. Или, альтернативно, вы можете предоставить счет. См. en.cppreference.com/w/cpp/string/basic_string/find_first_not‌​_of
Sebastian 29.02.2024 22:53

Тактическое примечание: из-за фундаментальных различий в идеологиях между C++ и Java Java (и наоборот) является плохим языком для использования в качестве основы для понимания C++. То, что вы узнаете о логике программы, останется в силе, но то, как лучше всего реализовать эту логику, часто радикально отличается.

user4581301 29.02.2024 22:57

Тактическое примечание. Chat GPT — это языковая модель, а язык, который она моделирует, НЕ является C++. Относитесь ко всему, что он говорит, с недоверием и тщательно проверяйте его результаты.

user4581301 29.02.2024 22:58

@Eljay, я использовал &SPACE, потому что думал, что если я использую адрес вместо самой строки, она не скопируется. Теперь я понял, что мне не нужно этого делать. Я просто пытался оптимизировать код.

Kurisuchan 01.03.2024 08:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема связана с

constexpr char SPACE = ' ';
const size_t first_index = input.find_first_not_of(&SPACE);

внутри функции trim. find_first_not_of ожидает в качестве входных данных строку c или std::string. &SPACE не является c-строкой, поскольку не заканчивается нулем. Это приводит к тому, что ваша программа имеет неопределенное поведение и почему вы получаете разные результаты от запуска к запуску.

Чтобы это исправить, просто поставьте лайк const std::string

const std::string SPACE = " ";
const size_t first_index = input.find_first_not_of(SPACE);

Вам также нужно будет исправить

const size_t last_index = input.find_last_not_of(&SPACE);

Используя приведенное выше предложение, которое превратит его в

const size_t last_index = input.find_last_not_of(SPACE);

Как указывает опустошение кучи в комментариях, существует также перегрузка, которая принимает всего один символ и которую можно использовать как

constexpr char SPACE = ' ';
const size_t first_index = input.find_first_not_of(SPACE);
...
const size_t last_index = input.find_last_not_of(SPACE);

Опереди меня на несколько секунд. Проголосуйте за :)

Botje 29.02.2024 22:49

Другой вариант: оставить constexpr char SPACE = ' '; как есть, но использовать перегрузку с одним символом: find_first_not_of(SPACE).

heap underrun 29.02.2024 22:51

@heapunderrun Хороший звонок, забыл об этой перегрузке. Я добавил это в ответ.

NathanOliver 29.02.2024 22:54

Передача &SPACE в find_first_of и подобные функции вызывают перегрузку, которая ожидает строку c, а не перегрузку, которая ожидает std::string.

Peter 01.03.2024 01:19

Спасибо за ваши ответы, ребята, это сработало! Теперь у меня есть вопрос: мне не нужно использовать здесь &SPACE: input.find_first_not_of(SPACE), потому что сама функция примет его как адрес, верно? Это означает, что строка не будет воссоздаваться внутри функции.

Kurisuchan 01.03.2024 08:16

Кроме того, я только что узнал, что есть эта функция strtok, я не знал о ней, поэтому попытался реализовать свое собственное разделение. Но эй, по крайней мере, мне нужно чему-то научиться.

Kurisuchan 01.03.2024 08:30

@Kurisuchan strtok — это способ сделать это на языке C. Если вы хотите увидеть некоторые способы C++, см.: stackoverflow.com/questions/14265581/…

NathanOliver 01.03.2024 14:12

Другие вопросы по теме

Похожие вопросы

Как нарисовать несколько линий и дуг разными цветами?
Компиляция шейдера GLSL не удалась из-за несуществующего символа
Swig неправильно определяет структуру для вызова C++
Функция сортировки слиянием не работает, если размер вектора не равен 2^n
Захват указателя функции в качестве ссылки приводит к сбою сегмента
Чтение com-порта с помощью библиотеки asio. Контрольная сумма не совпадает. Питон->С++
Почему можно использовать возврат лямбды, переданной в качестве аргумента аргумента функции constexpr, в константном выражении внутри функции?
Включение и проверка битовой четности между C++ и Python
Какова продолжительность хранения и время существования параметра шаблона, не являющегося типом, и как его можно использовать для вычислений во время компиляции?
Получение TLE в вопросе 212 по лит-коду - поиск слов 2 с использованием обратного отслеживания даже после обрезки, как мне его еще оптимизировать