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

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

18.07.2018, 01:21. Показов 7165. Ответов 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
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
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
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
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
4082 / 2680 / 432
Регистрация: 09.09.2017
Сообщений: 11,900
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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru