Форум 3DNews
Вернуться   Форум 3DNews > Программирование > Программирование

Ответ Создать новую тему
Опции темы Опции просмотра
Непрочитано 27.07.2007, 15:23   [включить плавающее окно]   #1
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Вопрос по С++: как написать программу с ключами

Привет!
Прошу совета. Требуется написать консольное приложение которое будет выполнять некие разные действия в зависимости от заданных при запуске ключей в командной строке. Объясните, как в прогу запихиваются эти самые ключи? Или, где почитать об этом? Или, хотя бы, как правильно в гугле запрос сделать?
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 27.07.2007, 16:51   [включить плавающее окно]   #2
Phodopus
Мужской Продвинутый
 
Регистрация: 05.10.2005
Адрес: Санкт-Петербург
Так ведь как параметры в main() - argv и argc или как-то оч. похоже называются..
Phodopus вне форума  
Ответить с цитированием
Непрочитано 27.07.2007, 18:18   [включить плавающее окно]   #3
point
Мужской Общительный
 
Аватар для point
 
Регистрация: 30.12.2006
Адрес: Донецк
Цитата
Так ведь как параметры в main() - argv и argc или как-то оч. похоже называются..
Точно, есть - один отвечает за колличество аргументов переданных программе, другой это двумерный чаровский массив с этими самыми аргументами комстроки. А дальше их используешь в проге как хочешь.
point вне форума  
Ответить с цитированием
Непрочитано 28.07.2007, 22:28   [включить плавающее окно]   #4
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Спасибо
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 16.08.2007, 16:27   [включить плавающее окно]   #5
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Ккие-то проблемы. Поставил себе Visual Studio 2005. Теперь такая программа:
Код:
#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, char *argv[])
{
	for(int i = 0; i < argc; i++)
	{
		cout << argv[i] << "\n";
	}
	return 0;
}
если ее вызвать с ключиком например 12 вылаеи результат:
c
1

Как получить доступ к остальным частям элемнтов argv?!
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 16.08.2007, 19:06   [включить плавающее окно]   #6
point
Мужской Общительный
 
Аватар для point
 
Регистрация: 30.12.2006
Адрес: Донецк
Молодец, программировать интересно!
Только я не пойму что ты "намутил" тут.
Если передаешь один параметр, то argc (первый парамент имя самой проги) у тебя равно 2.
Для чего в цикле for(int i = 0; i < argc; i++) такое условие? Кстати он у тебя крутанется два раза. Первая интерация выдает первую букву твоей проги "c", а вторая первый символ параметра.
Понял ошибку?
Т.е. сделай проверку на наличие аргуументов
if(argc>1)
а потом выводи массив.
ток учти масив двумерный!
чтоб понятней вот смотри
argv[0][0] это первый элемент первого аргумента, а
argv[1][0] это первый элемент второго аргумента

point добавил :

Вижу с выбором среды уже определился
point вне форума  
Ответить с цитированием
Непрочитано 16.08.2007, 20:24   [включить плавающее окно]   #7
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Цитата (point) »
Вижу с выбором среды уже определился
К чему help есть....
Цитата (point) »
Т.е. сделай проверку на наличие аргуументов
Ну... Я немного подрезал, то что уже наворотил. Проверочка есть. Фигня в том, что вот такой скриптик:
Код:
// calendar.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <time.h>

using namespace std;

int _tmain(int argc, char *argv[])
{
	struct tm cur_time;
	errno_t err;
	__time64_t raw_time = _time64(NULL);
	
	if (argc == 1)
	{
		err = _localtime64_s(&cur_time, &raw_time);
		if (err)
		{
			cout << "Illegal input data for _localtime64";
			exit(1);
		}
		cout << "Current data: " << cur_time.tm_mday << ":" << cur_time.tm_mon << ":" << cur_time.tm_year + 1900 << "\n";
		cout << "For help, please, use -h key\n";
	}

	else for(int i = 0; i < argc; i++)
		{
			int j=0;
			while (argv[i][j])
			{
				cout << argv[i][j] << "\n";
				j++;
			}
			cout << "\n";
		}
	return 0;
}
Все равно выдает только первы знаки ключей. Как до остальных добраться?
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 17.08.2007, 08:53   [включить плавающее окно]   #8
Xaionaro
Мужской Бывалый
 
Аватар для Xaionaro
 
Регистрация: 09.07.2003
Адрес: Москва
Jabberwocky, не понимаю я твоей проблемы:
Цитата (bash) »
[xaionaro@xaionaro ~]$ cat t.cpp
Код:
#include <iostream>

int main(int argc, char *argv[])
{
    int i=1;
    while(i<argc)
        std::cout << argv[i++] << "\n";
    return 0;
}
[xaionaro@xaionaro ~]$ g++ -o ctest t.cpp
[xaionaro@xaionaro ~]$ ./ctest dsfklj 3298r arg3 "multi-word argument (#4)"
Код:
dsfklj
3298r
arg3
multi-word argument (#4)
Чёрт, ну вот я просил ставить слэши перед ковычками? (в оригинале их нет)
__________________
Ingenio stat sine morte decus...

Последний раз редактировалось Xaionaro; 17.08.2007 в 09:09.
Xaionaro вне форума  
Ответить с цитированием
Непрочитано 17.08.2007, 10:04   [включить плавающее окно]   #9
point
Мужской Общительный
 
Аватар для point
 
Регистрация: 30.12.2006
Адрес: Донецк
Xaionaro а чем твой код
Код:
    
while(i<argc)
       std::cout << argv[i++] << \"\n\";
отличается от этого
Jabberwocky
Код:
for(int i = 0; i < argc; i++)
	{
		cout << argv[i] << \"\n\";
	}
Оба кода должны по-идее работать.

Jabberwocky
Цитата (point) »
не пойму что ты "намутил" тут.
извини, всё у тебя правильно в первом варианте.


point добавил :

только непонятно почему не пашет
point вне форума  
Ответить с цитированием
Непрочитано 17.08.2007, 11:26   [включить плавающее окно]   #10
Unconnected
Мужской Бывалый
 
Аватар для Unconnected
 
Регистрация: 20.07.2004
первый вариант кода корректно работает, будучи откомпилированным в visual c++ 6 с заменой _tmain на main
Unconnected вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 17.08.2007, 12:22   [включить плавающее окно]   #11
Jabberwocky
Мужской Умудрённый
Автор темы
 
Аватар для Jabberwocky
 
Регистрация: 14.12.2003
Адрес: Москва
Всё, доперло. Дело в том, что я поначалу использовал С++ builder, но из-за отсутствия хелпов от него пришлось отказаться. В нем мой код был корректным. В Visual С++ изначально задается уже некоторая структура програмы, где вместо
int main(int argc, char *argv[])
стоит
int _tmain(int argc, _TCHAR* argv[])
на что я внимания не обратил. Вернее, проглазел, что вместо main стоит _tmain
В общем код в таком виде:
Код:
#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	int i=1;
    while(i<argc)
        std::cout << argv[i++] << "\n";
    return 0;
}
дает такой результат:
Код:
$>test.exe gsgsdg
003650CE
Та есть, выводится указатель на первый символ параметра.

Jabberwocky добавил :

Unconnected
Твой пост не прочитал. Спасибо за совет.
модем

Jabberwocky добавил :

Unconnected
А как сделать правильно с использованием _tmain?
__________________
Никогда не существовало и не будет существовать никаких «прикладных наук», есть лишь приложения наук (весьма полезные!) © Л. Пастер
Jabberwocky вне форума  
Конфигурация ПК
Ответить с цитированием
Непрочитано 17.08.2007, 13:48   [включить плавающее окно]   #12
passer-by
Общительный
 
Регистрация: 16.12.2003
Код:
int _tmain(int argc, TCHAR *argv[])
{
	int i = 0;

	while (i < argc)
#ifndef UNICODE
		std::cout << argv[ i++ ] << std::endl;
#else
		std::wcout << argv[ i++ ] << std::endl;
#endif

	return 0;
}
passer-by вне форума  
Ответить с цитированием
Ответ Создать новую тему

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 08:38. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 2000-2017 3DNews. All Rights Reserved.
Администрация 3DNews требует соблюдения на форуме правил и законов РФ
Серверы размещены в Hostkey