Форум программистов, компьютерный форум CyberForum.ru

Параметры в командной строке - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
22.07.2010, 21:24     Параметры в командной строке #1
При запуске программы с командной строки, ей также с cmd передаются параметры. Затем в программе эти параметры присваиваются или char a[10] или типу string. Но!!! Когда пытаюсь использовать эти значения (char или string) в программе, или даже просто вывести их значения на экран, то выводятся первые символы этих параметров!
Кто знает почему??? ведь в main(int argc, char *argv[]) по идее передается массив символов!!?
Вот пример кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int _tmain(int argc, char* argv[]) //Принимаются только первые буквы аргументов?!?!
{
        char a[10]=argv[1];
        char b[10]=argv[2];
 
        cout << "a: " << a << endl;
        cout << "b: " << b << endl;
 
    _getch();
 
    return 0;
}
В командной строке нужно набрать:

c:\>test.exe param1 param2 //test.exe это мое название экзешника.

результат:
a= p
b= p


Помогите разобраться!!! Буду весьма признателен!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
22.07.2010, 21:32     Параметры в командной строке #2
естественно ты ведь копируешь 1е символы, попробуй так
char *a=argv[1];
char *b=argv[2];
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
22.07.2010, 21:35     Параметры в командной строке #3
не совсем понял, как у тебя таким присваиванием получить из char* char[10] (char a[10]=argv[1])

вобщем, тебе надо

C++
1
2
char a[10]=argv[1];
char b[10]=argv[2];
заменить на

C++
1
2
char *a=argv[1];
char *b=argv[2];
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16841 / 5262 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
22.07.2010, 21:43     Параметры в командной строке #4
Alexandr_LN, почитай тут http://www.cyberforum.ru/cpp/thread152233.html
Там вопросы были по сути теми же самыми
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
23.07.2010, 09:48  [ТС]     Параметры в командной строке #5
Спасибо!! Завтра попробую и отпишу, какой результат.

Добавлено через 11 часов 43 минуты
В общем когда я сделал как вы сказали:
char *a=argv[1];
char *b=argv[2];

то програма не проходит отладку (
так что это не выход...
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
23.07.2010, 09:49     Параметры в командной строке #6
а что выдаёт? посмотри, мб у тебя в параметрах проекта стоит не debug, а release
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
23.07.2010, 09:51  [ТС]     Параметры в командной строке #7
Ну да, стоит release. Но я пробовал и debug, результат тот же
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
23.07.2010, 09:52     Параметры в командной строке #8
ну при отладке надо режим debug включать, release на то и release чтоб в нём не отлаживать.

а всё таки, что значит "не проходит отладку" ?
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
23.07.2010, 09:54  [ТС]     Параметры в командной строке #9
Если даже запустить такой код, то все равно выводятся только первые буквы параметров...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int _tmain(int argc, char* argv[])
{
    for(int i=0;i<argc;i++)
    {
        cout << "argument: " << argv[i] << endl;
    }
    return 0;
}
c:\>test.exe oneparam twoparam

argument: o;
argument: t;
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
23.07.2010, 09:59     Параметры в командной строке #10
ммм...прикрепи весь проект.
пробовал твой код -- в VS2005 и bcc5.5 - всё работает нормально, вероятно что то с настройками проекта
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
23.07.2010, 10:06  [ТС]     Параметры в командной строке #11
я понимаю но я делаю так, сначала запускаю под debug, а потом делаю экзешник под release.
но именно этот код:
char *a=argv[1];
char *b=argv[2];

не проходит отладку. Ошибка возникает в потоке ostream. Связано с неправильным обращением к памяти...
В общем это не выход так писать.

Добавлено через 5 минут
Да вот и весь проэкт. Я просто хочу чтобы параметры передались через командную строку, а затем программа вывела на экран эти же параметры!!! Вот и все )) если знаешь то подскажи как это сделать!!!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int _tmain(int argc, char* argv[])
{
    for(int i=0;i<argc;i++)
    {
        cout << "argument: " << argv[i] << endl;
    }
 
    _getch();
 
    return 0;
}
 Комментарий модератора 
Используйте теги форматирования кода!
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
23.07.2010, 10:12     Параметры в командной строке #12
а, понял теперь

убери из настроек проекта юникод, или используй че нить типа _tprintf

Т.е. для юникода:

C++
1
2
3
4
5
6
int _tmain(int argc, _TCHAR* argv[])
{
for(int i=0;i<argc;i++)
{
_tprintf(_T("arg: %s\n"), argv[i]);
}
или же - Project->Properties->Configuration Properties->General, там находишь Character Set и ставишь ему Not Set, если юникод тебе не нужен
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
23.07.2010, 10:17  [ТС]     Параметры в командной строке #13
Да пробовал... _tprintf не пробовал, но это тоже не выход, во всей литературе написано, что argv[] принимает указатели на строки, поэтому все должно нормально отображаться, а не только первый символ ((
el Gato Estelar
 Аватар для el Gato Estelar
9 / 9 / 0
Регистрация: 26.05.2010
Сообщений: 36
23.07.2010, 10:22     Параметры в командной строке #14
Ну при использовании юникода(в release он автоматом у меня ставится), у меня тоже выводило только первые символы -- фишка в том, что в этом случае студия считает, что тебе пришла мультибайтовая строка, а ты работаешь с ней обычными функциями, для однобайтовых. Точно не уверен, но думаю, что латинские буквы добиваются в юникоде нулями справа, поэтому cout выводит первый символ, натыкается на \0, думает, что это уже второй символ и завершает вывод.

Либо используй мультибайтоввые функции -- пример выше у меня на vs2005-release работал нормально. Либо убери настройку юникода - так у меня тоже заработало
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
23.07.2010, 10:39  [ТС]     Параметры в командной строке #15
))) ну ты красавчик. Спасибо!!! А в литературе ни одного слова об этом...
Весьма благодарен!!! )
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.07.2010, 10:42     Параметры в командной строке #16
Цитата Сообщение от Alexandr_LN Посмотреть сообщение
int _tmain(int argc, char* argv[])
поменяйте на
C++
1
int main(int argc, char *argv[])
Цитата Сообщение от Alexandr_LN Посмотреть сообщение
#include "stdafx.h"
а вот это - зло от мелкомягких
Вообще консольные программы лучше делать как-то ближе к стандарту (а в стандартном С/С++ главная функция называется main() а не _tmain() +Ыmain() или ещё как-нибудь)
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main(int argc, char ** argv){
    while ( argc-- )
        std::cout << *argv++ << std::endl;
    return 0;
}
сохраните это с именем например arguments.cpp, откройте консоль студийную, перейдите в ней в папку с файлом и там
cl arguments.cpp
arguments.exe one two three
Alexandr_LN
1 / 1 / 0
Регистрация: 28.04.2009
Сообщений: 116
23.07.2010, 10:51  [ТС]     Параметры в командной строке #17
easybudda и тебе огромное спасибо! ))
блин я себя чувствую растением в сравнении с тобой ))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2014, 23:04     Параметры в командной строке
Еще ссылки по теме:

Запуск в командной строке C++
C++ Тетрис в командной строке
C++ Выполнение действия в командной строке

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

Или воспользуйтесь поиском по форуму:
Копченный
0 / 0 / 0
Регистрация: 02.11.2014
Сообщений: 15
05.11.2014, 23:04     Параметры в командной строке #18
Всем привет) Чет не могу разобраться с этой темой) Может подскажите? Зачем argc и argv существуют??
Yandex
Объявления
05.11.2014, 23:04     Параметры в командной строке
Ответ Создать тему
Опции темы

Текущее время: 16:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru