Получение размера аргументов командной строки / доступ к отдельным символам в аргументах командной строки

Заранее спасибо за чтение этого,

Я практикую получение и манипулирование аргументами из командной строки, написав программу, которая принимает один аргумент и возвращает его размер. Из того, что я прочитал, каждый аргумент командной строки завершается нулем, и каждый отдельный символ может быть доступен как обычный 2D-массив (пожалуйста, исправьте меня, если я ошибаюсь). Итак, я написал:

for (int i = 0; i > -1; i++)
{
cout << "Doing " << &argv[1][i] << endl;
if (&argv[1][i] != "\0") Size++;
else break;
}

Это хорошо компилируется под g ++, но когда я запускаю его, это происходит:

user@computer:~/Programming$ ./ReturnSize 12345
Doing 12345
Doing 2345
Doing 345
Doing 45
Doing 5
Doing
Doing ORBIT_SOCKETDIR=/tmp/orbit-user

И затем он продолжает идти до тех пор, пока не выйдет из строя.
Что я делаю неправильно? Есть ли лучший способ определения размера аргументов / доступа к отдельным элементам в аргументах?

1

Решение

В этом заявлении

if (&argv[1][i] != "\0") Size++;

вы сравниваете два указателя (строковый литерал неявно преобразуется в указатель на его первый элемент в этом выражении). Поскольку они занимают разные области памяти, условие в операторе if всегда будет равно true, если массивы не будут перекрывать друг друга.

Изменить это утверждение на

if ( argv[1][i] != '\0' ) Size++;

Чтобы получить размер аргумента командной строки, вы можете использовать стандартную функцию C std::strlen объявлено в заголовке <cstring>

Например

size_t Size = std::strlen( argv[1] );

Что касается вашего цикла, то это может быть написано проще

size_t Size = 0;
while( argv[1][Size] )
{
cout << "Doing " << &argv[1][Size] << endl;
++Size;
}
2

Другие решения

for (int i = 0; i > -1; i++) действительно ???
Простой способ ::

#include<iostream>
#include<cstdlib>
int main(int argc, char* argv[])
{
for (int i = 1; i < argc; ++i)
{
std::string temp = argv[i];
std::cout << temp << " | " << temp.length() << std::endl;
Size = temp.length();
}
return 0;
}
2

Помимо того, что вся программа немного странная (см. Комментарий pippin1289), ваше условие if неверно: вы хотите:

if (argv[1][i] != '\0')
1

Цикл for не имеет смысла. Вы увеличиваете i и проверяете, больше ли оно -1. Конечно, это. Тестирование на строку «\ 0» — это не то же самое, что тестирование на нулевой символ «\ 0». Это один из источников вашей проблемы. Кроме того, я бы не стал зацикливаться на каждом шаге. Вы можете просто отправить всю строку в поток или использовать функции библиотеки C для него.

1

Любое логическое выражение может быть оценено. Например, вы можете написать:

for (int i = 0; true; i++) {
}

Как говорится, что-то вроде

for (int i = 0; i argv[1][i] != '\0'; i++) {

}

может работать хотя и нетрадиционно

0
По вопросам рекламы [email protected]