Есть ли способ принять все параметры в виде одной строки?

Например,

Вход:

echo( hello world

Программа:

#include<stdio.h>

int main(int n,char** args){
// Replace all the '\0' with ' '
system(args[1]);
return printf("\n");
}

Выход:

hello world

Теперь мне нужен привет мир в указателе.

Я знаю, что **char не работает так, как я хочу..

Но есть ли какой-нибудь эффективный выход, вместо того, чтобы вычислять длину каждого аргумента, выделять эти многочисленные байты и затем объединять их с выделенной памятью?

Может быть, какой-то спецификатор доступа для char**?

Я пытаюсь добавить echo( команду в DOSBox, поэтому в основном echo params, а затем напечатать новую строку. Вот и все.

Кроме того, есть ли способ исключить распознавание exe без пробелов или это зависит от консоли?


person Hello World    schedule 20.02.2020    source источник
comment
Почему бы не просто myexe "hello world" ?   -  person Sander De Dycker    schedule 20.02.2020
comment
вы не можете повлиять на это в myexe, но вы можете вызвать myexe "hello word", тогда вся строка будет в argv[1]   -  person Ingo Leonhardt    schedule 20.02.2020
comment
Я пытаюсь добавить echo( в свой DOSBox... Но большое спасибо, это помогло мне решить еще одну проблему.   -  person Hello World    schedule 20.02.2020
comment
Мы можем принять эти аргументы, используя argc и argv. Тогда мы можем использовать их соответствующим образом.   -  person Vikas Vijayan    schedule 20.02.2020
comment
@VikasVijayan Это правда, но для компьютера это много работы. Я имею в виду, что мы этого не почувствуем, но я искал более эффективный способ.   -  person Hello World    schedule 20.02.2020
comment
Отвечает ли это на ваш вопрос? Могу ли я передать целую строку как один аргумент командной строки в argv в C?   -  person Sander De Dycker    schedule 20.02.2020
comment
Сандер Де Дайкер и Инго Леонхардт предложили такое же решение. К сожалению нет.   -  person Hello World    schedule 20.02.2020
comment
Вы используете расплывчатые термины, чтобы описать то, что вы хотите. Более эффективно не является конкретной спецификацией. Если вам действительно нужна помощь в решении проблемы, опишите ее в терминах и, кстати, используя минимально воспроизводимый пример чтобы проиллюстрировать, что вы пытаетесь сделать.   -  person ryyker    schedule 20.02.2020
comment
Мне нужен способ получить все аргументы в одном указателе, строке, которая завершается в конце.   -  person Hello World    schedule 20.02.2020
comment
И люди уже предложили ответ. Окружите любой контент, который вы хотите, двойными кавычками в командной строке вашего исполняемого файла "this,is,a,beautiful,day", который можно легко проанализировать из одной строки, содержащейся в одной переменной argv[1].   -  person ryyker    schedule 20.02.2020
comment
Я пытаюсь смоделировать команду echo( на моем DOSBox.   -  person Hello World    schedule 20.02.2020
comment
Я пытаюсь смоделировать команду echo( в моем DOSBox: пожалуйста, отредактируйте свой вопрос и уточните .   -  person Jabberwocky    schedule 20.02.2020
comment
@HelloWorld: сначала попробуйте предложенное решение, прежде чем говорить, что оно не делает то, что вы хотите.   -  person Sander De Dycker    schedule 20.02.2020
comment
echo( Hello World --› система(argsfrom1) + printf(\n)   -  person Hello World    schedule 20.02.2020
comment
Ирония заключается в том, что код запуска программы MS-DOS на C отвечает за синтаксический анализ командной строки и построение массива argv перед вызовом main. Итак, вам нужен доступ к этой версии командной строки более низкого уровня. В Windows для этого есть функция GetCommandLine, но я не знаю, что эквивалентно ей в библиотеках Turbo C для DOS.   -  person Ian Abbott    schedule 20.02.2020
comment
Под имитацией команды echo( вы имеете в виду эхо пустой строки? В DOS вместо этого можно использовать echo/.   -  person Stephan    schedule 20.02.2020
comment
Хорошо, подождите... Возможно, это был правильный ответ. Пожалуйста, разместите это. Спасибо.   -  person Hello World    schedule 20.02.2020
comment
@Привет: готово. Это крайний пример XY-проблемы :D   -  person Stephan    schedule 21.02.2020
comment
???? Лол, ты до сих пор помнишь слова сэра @MichaelPetch   -  person Hello World    schedule 21.02.2020
comment
@IanAbbott: в крошечной модели строка аргумента помещается в CS: 0x0080 до CS: 0x00FF перед запуском программы. Я не знаю, оставляет ли Turbo C его там или перезаписывает. Я думаю, что есть способ запросить сегмент префикса запуска программы в других моделях памяти, но я не помню, что это такое.   -  person supercat    schedule 31.03.2020


Ответы (3)


Чтобы отобразить пустую строку, в Windows cmd лучшим методом является echo(, но также распространены echo/, echo. и некоторые другие варианты.

(лучше всего подходит для cmd) echo( не работает в DOS (выдает ошибку bad command or filename), но echo/ прекрасно работает даже в DOS.

person Stephan    schedule 20.02.2020

Сделайте это одной строкой.

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char oneline[256] = "";
    for(int index = 1; index < argc; index++) 
    {
        strcat(oneline, argv[index]);
        strcat(oneline, " ");
    }

    printf("parameters: "%s"\n", oneline);
}

https://godbolt.org/z/B4ULLB

Это только идея, и это можно сделать намного эффективнее, например, не используя strcat или более эффективно распределяя память. Но идея будет та же. Также можно не добавлять последний пробел (это для придирок)

person 0___________    schedule 20.02.2020
comment
Можно ли echo( воспроизвести в DOS без пробелов? - person Hello World; 20.02.2020

Мне нужен способ получить все аргументы в одном указателе, строке, заканчивающейся в конце.

Используя любую форму функции main():

int main(int argc, char *argv[]) {...};
int main(int argc, char **argv) {...};

которые являются эквивалентными сигнатурами для функции C main(), позволят вам передать любое количество аргументов любого размера. Если вы хотите передать одну строку, содержащую множество аргументов, просто передайте одну строку с каким-либо разделителем. Если разделителем является пробел ( " " ), то по определению поведения командной строки функции C main() аргумент требует окружить их ":

Скажите, что ваше имя exe - prog.exe

prog this,is,one,argument
prog "this is one argument"  //double quotes provide cohesion between space delimited command line arguments 
prog this-is-one-argument

Все будет содержаться в одной переменной: argv[1]

Если вы скомпилируете это как echo.exe, оно поместит в stdout любую вещь, введенную в stdin:

int main(int argc, char **argv)
{
  if(argv != 2) return 0;
  fputs(argv[1], stdout);
  return(0);
}

Использование: echo "this will be echoed onto stdout"<return>
Использование: abc000<return>
Использование: this-is-one-argument<return>

person ryyker    schedule 20.02.2020
comment
@HelloWorld - argv[1] предоставляется как указатель на одну строку, то есть конкретно на первый аргумент вашего вызова prog.exe - person ryyker; 20.02.2020
comment
Да, и он записывает 0 во все остальные ячейки памяти, так что на самом деле он выглядит как индексируемый 2D-массив. - person Hello World; 20.02.2020
comment
@HelloWorld - вы смотрели ссылку, которую я предоставил, описывающую, как определяется обработка командной строки для функции C main(...)? Если argc == 2, то по определению будет только 2 элемента до *argv[]: argv[0] и argv[1] - person ryyker; 20.02.2020
comment
Да, на самом деле этот метод помог мне решить еще одну проблему. - person Hello World; 20.02.2020