2016-02-05 5 views
-2

Общая суть программы заключается в принятии аргумента командной строки и для каждой строки для печати назад с переменной длиной.Обратные аргументы командной строки (C)

Например:

$ ./reversecommand hello 102 
dnammocesrever/. olleh 201 

У меня возникают трудности при осуществлении процесса мышления в код (например, с приветом ниже). Есть предположения?

argc[0] ./reversecommand 
argc[1] hello 
argc[1][0] h -> argc[1][4] o 
argc[1][1] e -> argc[1][3] l 
argc[1][2] l -> argc[1][2] l 
argc[1][3] l -> argc[1][1] e 
argc[1][4] o -> argc[1][0] h 
argc[2] 102 
argc[3] [null] 
+1

вы хотите отменить имя исполняемого файла и с привет и 102? –

+0

Просканируйте каждую строку аргумента, измените ее и распечатайте обратное значение. Вы можете изменить строки аргументов, хотя это не всегда одобрено во всех кругах программирования. Или вы можете предоставить хранилище для инвертированной строки. Или вы можете просто напечатать символы строк в обратном порядке. –

ответ

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

static void print_reversed(const char *str, size_t len) 
{ 
    const char *ptr = str + len; 
    while (ptr > str) 
     putchar(*--ptr); 
} 

int main(int argc, char **argv) 
{ 
    for (int i = 0; i < argc; i++) 
    { 
     if (i != 0) 
      putchar(' '); 
     print_reversed(argv[i], strlen(argv[i])); 
    } 
    putchar('\n'); 
    return 0; 
} 

Там нет необходимости изменять строки; просто распечатывайте символы по одному в обратном порядке.

0

Логика довольно проста: Для каждой строки в ARGV, реверс, а затем распечатать его.

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

void swap_characters(char *s, char *t) { 
    char tmp = *s; 
    *s = *t; 
    *t = tmp; 
} 

void reverse_string(char *s, int length) { 
    for (int i = 0; i < length/2; ++i) 
     swap_characters(s + i, s + length - 1 - i); 
} 

int main(int argc, char **argv) { 
    for (int i = 0; i < argc; ++i) { 
     reverse_string(argv[i], strlen(argv[i])); 
     printf("%s ", argv[i]); 
    } 
    printf("\n"); 
} 
0

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

простая реализация для строк с нулевым завершающим в C выглядит

char * reverse(char * string){ 
    int i; 
    int len = strlen(string); 
    for (i = 0; i < len/2; i++){ 
    char c    = string[i]; 
    string[i]   = string[len - i - 1]; 
    string[len - i - 1] = c; 
    } 
    return string; 
} 

Эта версия делает манипулировать строку, так что мы будем делать копию строки только в том случае.

После того, как у вас есть разворот строк, вам нужно будет запустить reverse по каждому аргументу и распечатать его.

ПРИМЕЧАНИЕ: аргументы в стандартном консольном приложении, подобные этому, начинаются с имени программы, так как она была введена пользователем. Таким образом, если программа вызывается как ./my-program arg1 arg2, argv[0] будет "./my-program", поэтому мы пропустим argv[0]

Используя это, все, что вам нужно сделать, это обратный вызов по каждому аргументу. как так

int main(int argc, char ** argv){ 
    int i; 
    char * copy; 

    for (i = 1; i < argc; i++){ // skip argv[0] 
    copy = strdup(argv[i]); // copy the string; 
    copy = reverse(copy); 

    printf("argv[%d] = \"%s\"\n", i, copy); 

    free(copy); // clean up the copy 
    } 
} 

Все вместе, вы получите

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

char * reverse(char * string){ 
    int i; 
    int len = strlen(string); 
    for (i = 0; i < len/2; i++){ 
    char c    = string[i]; 
    string[i]   = string[len - i - 1]; 
    string[len - i - 1] = c; 
    } 
    return string; 
} 


int main(int argc, char ** argv){ 
    int i; 
    char * copy; 

    for (i = 1; i < argc; i++){ // skip argv[0] 
    copy = strdup(argv[i]); // copy the string; 
    copy = reverse(copy); 

    printf("argv[%d] = \"%s\"\n", i, copy); 

    free(copy); // clean up the copy 
    } 
} 
0

Попробуйте этот код дать имя файла как реверсе и поставить аргумент командной строки: - May be this will work for you.....

+0

Наблюдение: 'strrev()' не является частью стандарта C или POSIX. Там, где это доступно, разумно использовать его, но он доступен не везде. –

+0

спасибо Джонатан Леффлер. :) –

Смежные вопросы