反向命令行参数(C)

时间:2016-02-05 04:52:41

标签: c

程序的总体要点是接受一个命令行参数,并为每个字符串向后打印可变长度。

例如:

$ ./reversecommand hello 102
dnammocesrever/. olleh 201

我很难将思维过程实现到代码中(例如,下面有hello)。有什么想法吗?

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]

4 个答案:

答案 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;
}

无需修改字符串;只需按相反的顺序逐个打印出一个字符。

答案 1 :(得分: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");
}

答案 2 :(得分:0)

有许多方法可以进行字符串反转,值得花一些时间研究,因为这是一个标准的面试问题。

C中以null结尾的字符串的简单实现看起来像

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 arg2argv[0]将为"./my-program",那么我们将跳过argv[0]

使用它,你所要做的就是在每个参数上调用reverse。像这样

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
  }
}

答案 3 :(得分:0)

尝试此代码将文件名作为反向并输入命令行参数: - May be this will work for you.....