Есть ли способ принять все параметры в одну строку? - PullRequest
0 голосов
/ 20 февраля 2020

Например,

Ввод:

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 не работает так, как я хочу ..

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

Возможно, какой-то спецификатор доступа для char**?

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

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

Ответы [ 3 ]

1 голос
/ 20 февраля 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 или более эффективно распределять память. Но идея будет такой же. Вы также не можете добавить последний пробел (это для придира)

1 голос
/ 21 февраля 2020

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

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

1 голос
/ 20 февраля 2020

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

Использование любой формы функции main():

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

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

Скажите ваш exe name is 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>

...