Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
99 / 98 / 11
Регистрация: 12.09.2016
Сообщений: 195

Передать строку типа string в system

18.07.2018, 01:21. Показов 7270. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Нужно реализовать функцию,которая бы передавала в system аргумент str (который ввел пользователь)
Хотел написать программу,которая бы выключала компьютер через определенное время
Пытался реализовать вот так:
C++
1
2
3
4
5
    string str = "shutdown \/s \/t ";
    int a;
    cin >> a;
    str += std::to_string(a);
    system(str);
Но в ответ получал лишь error C2664: "int system(const char *)": невозможно преобразовать аргумент 1 из "std::string" в "const char *"

Если я правильно понял,то system должна получать на вход константу.Нельзя ли как-нибудь обойти это ограничение?Или найти другой способ решения задачи (но обязательно через командную строку)
Буду благодарен за помощь!
P.S. не бейте палкой если написал бредятены)
1
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2018, 01:21
Ответы с готовыми решениями:

Как скопировать строку типа std::string в другую строку такого же типа?
Хотел скопировать строку #include "stdafx.h" #include <iostream> #include <string> using namespace std; int _tmain(int...

Где и почему используют ту или иную строку std::string, char[], System::String^ ?
Где и почему используют ту или иную строку std::string, char, System::String^ ? Объясните пожалуйста где нужно использовать...

Перевести строку типа string, в строку типа double
Помогите с кодом. Как строку типа стринг, например 123123.123123, перевести в тип double? Кода перевожу с помощью "atof" оно...

32
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
18.07.2018, 22:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Вот этой фразы не понял, как это он придумывает форматы? Можно пример?
Я не знаю, как реализован класс iostream, так как никогда не пользовался им в работе своей. Но подозреваю, что увидев
C++
1
2
int n; char s;
cout >> n <<  cout << s;
Он делает что-то вроде
C++
1
printf("%d%s", n, s);
Тут совсем другой подход - данные управляют. Иногда это очень здорово. Иногда - не очень. В данном случае - как раз не очень.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
18.07.2018, 22:54
Байт, но ведь можно настроить вывод как нравится. Просто дело привычки.

C++
1
cout << n << ' ' << (int)s << endl;
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
19.07.2018, 10:16
Цитата Сообщение от Байт Посмотреть сообщение
Результат-то - да. Но для полного выяснения ситуации этого мало.
А можете привести пример, где видна разница?
Я бы сказал так
C++
1
2
printf("%s\n", answ.c_str());
system(answ.c_str());
Хотя ни в коем случае не так
C++
1
2
3
char *p = answ.c_str();
printf("%s\n", p);
system(p);
Пожалуйста, поясните.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
19.07.2018, 11:49
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Пожалуйста, поясните.
А вы попробуйте второй вариант

Добавлено через 4 минуты
А вот так, кстати, можно
C++
1
2
3
4
5
char *p = new char[answ.size()+1];
strcpy(p, answ.c_str());
printf("%s\n", p);
system(p);
delete p;
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
19.07.2018, 11:57
COKPOWEHEU, я выше пояснил, почему так делать не стоит.

Цитата Сообщение от QuakerRUS Посмотреть сообщение
Потому что при изменении строки адрес СИ-строки может тоже измениться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    string s = "123";
    cout << (void*)s.c_str() << endl;
 
    for (int i = 0; i < 1000000; i++)
        s += "123";
 
    cout << (void*)s.c_str() << endl;
 
    system("pause");
    return 0;
}
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
19.07.2018, 12:25
Цитата Сообщение от Байт Посмотреть сообщение
А вы попробуйте второй вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <string>
 
int main(){
  std::string answ = "echo 'aaa'";
//первый вариант
  printf("%s\n", answ.c_str());
  system(answ.c_str());
//второй вариант
  char *p = (char*)answ.c_str(); //без явного приведения типов плевалось ошибкой
  printf("%s\n", p);
  system(p);
}
Code
1
2
3
4
5
6
$ g++ main.cpp
$ ./a.out 
echo 'aaa'
aaa
echo 'aaa'
aaa
Так что я должен был увидеть?
Цитата Сообщение от QuakerRUS Посмотреть сообщение
COKPOWEHEU, я выше пояснил, почему так делать не стоит.
Потому что при изменении строки адрес СИ-строки может тоже измениться.
Конечно, может. И что? Мы же не модифицируем строку между присвоением и обработкой.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
19.07.2018, 12:32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Мы же не модифицируем строку между присвоением и обработкой.
Мне кажется тут может зависеть от компилятора. Как именно реализована функция c_str? Может она каждый вызов будет генерировать заново эту строку и каждый вызов будет возвращать новый адрес. У меня на VS2017 по крайней мере, если строку не изменять, то адрес не меняется. Может у товарища Байта на его компиляторе изменяется. Посмотрим, что он ответит.

Добавлено через 3 минуты
COKPOWEHEU, так же еще можно допустить вариант, что мы "забудем", что адрес может измениться после модификации, вставим код между строками и потом будем мучительно искать логическую ошибку в программе.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.07.2018, 12:37
QuakerRUS, речь не о реализации c_str(), а о реализации std::string самой по себе. Которая по аналогии с std::vector тоже имеет наперёд выделенную динамическую память, и пересоздаёт её, если превышается capacity

Добавлено через 4 минуты
Влиять вышеописанное будет только при многопоточном изменении std::string, да и то я не уверен что printf("%s\n", answ.c_str()); поможет - переключение потоков может состояться именно в момент после вычисления аргумента.

Цитата Сообщение от Байт Посмотреть сообщение
А вот так, кстати, можно
C++
1
delete[] p;
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
19.07.2018, 12:39
Заглянул в стандарт C++17. Если я правильно понимаю, то, если не изменять объект, ссылка не будет меняться все же.

24.3.2.7.1 basic_string accessors [string.accessors]
const charT* c_str() const noexcept;
const charT* data() const noexcept;
1 Returns: A pointer p such that p + i == &operator[] (i) for each i in [0, size() ] .
2 Complexity: Constant time.
3 Requires: The program shall not alter any of the values stored in the character array.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.07.2018, 12:42
И ещё.
Начиная с С++11 c_str() и data() выполняют одну и ту же функцию.
https://ru.cppreference.com/w/... ring/c_str
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
19.07.2018, 13:22
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Как именно реализована функция c_str?
Когда я реализовывал собственные объекты строк, это был массив char, представляющий Си-шную строку и пару переменных под ее длину, чтобы не вычислять каждый раз заново. Ну и обвязка из методов и операторов, конечно. Как организовать хранение данных другим способом - не непрерывным массивом - я не представляю. Тем более если одно из требований - обязательная возможность приведения к обычной строке.
Ну, то есть, можно, конечно, организовать, например, связный список, а по c_str() на его основе формировать новую непрерывную строку... но опять же не представляю ситуацию, где это было бы оправдано.
Цитата Сообщение от TRam_ Посмотреть сообщение
Влиять вышеописанное будет только при многопоточном изменении std::string
Ну это только если совсем не уметь пользоваться многопоточностью. Потому что работа с любыми переменными должна быть либо атомарной, либо синхронизированной, либо буферизованной (комбинация двух предыдущих). Испортить многопоточностью можно хоть uint16_t.
Цитата Сообщение от QuakerRUS Посмотреть сообщение
3 Requires: The program shall not alter any of the values stored in the character array.
То есть str[2] = '2'; можно, а ((char*)str.c_str())[2] = '2'; нельзя? Наверное, это страховка для экзотических реализаций...
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
19.07.2018, 13:32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть str[2] = '2'; можно, а ((char*)str.c_str())[2] = '2'; нельзя? Наверное, это страховка для экзотических реализаций...
А, да, я не правильно все же понял первоначально эту фразу. Но впринципе все логично, не даром возвращается именно const char*, а не char*.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
19.07.2018, 13:45
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Может у товарища Байта на его компиляторе изменяется. Посмотрим, что он ответит.
Может быть и так. Компилятор Borland Builder 6. А может быть это был не string, а AnsiString. Но получалась чепуха. С тех пор я метода c_str побаиваюсь. И сразу копирую в char [] достаточной длины.
Возможно, обжегшись на молоке, дую на воду Но мне так спокойнее.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.07.2018, 13:45
Помогаю со студенческими работами здесь

Как совместить строку типа String, имеющуюся в коде и функцию, принимающую std::string ?
Доброго времен суток)) У меня такая проблема: есть строка типа String^ , а функция принимает string. Не знаю как их...

Как исправить E0144 значение типа "System::String ^" нельзя использовать для инициализации сущности типа
Как исправить E0144 значение типа &quot;System::String ^&quot; нельзя использовать для инициализации сущности типа ...

Преобразование типа string в System.IntPtr
Привет всем, как можно преобразование типа &quot;string&quot; в &quot;System.IntPtr&quot;. Я новенький в этом деле ещё и 1 недели не прошло как я перешел на...

Читать строку типа string из файла, разбить ее на массив слов типа char
Нужно сделать так что бы строчка вида &quot;&lt;слово1&gt;:&lt;слово2&gt;:&lt;слово3&gt;:&lt;слово4&gt;&quot; , считывалась и каждое слово заносилось в свою переменную....

Как преобразовать число типа int в строку типа string без методов-конвертов на C#?
В общем, все что выше написано. Пишу в Visual Studio на C#. Преобразовать без конвертирования, например, дано int, дано string, и это число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru