【问题标题】:Cleaning up an argv program清理 argv 程序
【发布时间】:2015-04-16 15:52:30
【问题描述】:

我有一个 argv c 程序,它反转单词,看看它是否是回文。我只是想清理输出并让它打印原始输入而不是反向输入,但由于它是 argv,我似乎无法弄清楚该怎么做。

int main(int argc, char* argv[])
{
    char *string = (char*)malloc(1000);                                                              
    string[0] = '\0';                                                                                

    for(i = 1; i < argc; i++)                                                                        
    strcat(string, argv[i]);

    for(j = 0; string[ j ]; j++)
    string[j] = tolower(string[ j ]);

    reverse(string);
    printf("Reverse of entered word is \"%s\".\n", string);

    result = is_palindrome(string);

    if ( result == 1)
        printf("\"%s\" is a palindrome.\n", string);
    else
        printf("\"%s\" is not a palindrome.\n", string); 

    system("pause");
}

我省略了其余的函数,但您可以在 main 中看到 printf 显示它是否是回文。不知道如何让它等于原始输入,并且知道参数的数量。目前它打印反转的字符串,当我认为打印原件看起来会更好时。我觉得我做得太难了,但我不确定。

【问题讨论】:

  • 什么是argv 程序?所有main都可以通过argv接收参数。
  • 为什么不直接打印字符串之前你反转它?

标签: c printing output argv


【解决方案1】:

显而易见的方法是反转反转的字符串,另一种方法是使用双引号将单个参数/字符串传递给程序:

./program "a man a plan a canal panama"

而不是

./program a man a plan a canal panama

那么你就不需要遍历args了。

【讨论】:

  • 我会尝试反转反转的,但这是针对课程的,教授将输入字符串,所以我无法控制。
【解决方案2】:

我看到两个问题: 参数数量在argc - 参见例如this question 了解更多关于 argcargv[] 的详细信息。

关于如何打印原始字符串,您可以在调用reverse() 之前打印字符串,将原始字符串存储在临时变量中以便稍后输出,或者在打印之前再次反转。第三个选项如下所示:

int main(int argc, char* argv[])
{
    char *string = (char*)malloc(1000);                                                              
    string[0] = '\0';                                                                                

    for(i = 1; i < argc; i++)                                                                        
    strcat(string, argv[i]);

    for(j = 0; string[ j ]; j++)
    string[j] = tolower(string[ j ]);

    reverse(string);
    printf("Reverse of entered word is \"%s\".\n", string);

    result = is_palindrome(string);

    if ( result == 1)
        printf("\"%s\" is a palindrome.\n", reverse(string));
    else
        printf("\"%s\" is not a palindrome.\n", reverse(string)); 

    system("pause");
}

【讨论】:

    【解决方案3】:

    更新,因为 OP 说教授将输入句子(不带引号!)。

    这可以简单地使用 MSVC 库函数来完成。因为strdup 分配了内存,所以也需要清理。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void fatal(char *msg);
    
    int main(int argc, char *argv[]) {
        int i, argslen = 0;
        char *inp, *rev;
        if (argc < 2)                           // check num args
            fatal("Need a string argument");
        for (i=1; i<argc; i++)                  // figure input length
            argslen += strlen(argv[i]) + 1;     // include spaces and EOS
        inp = malloc(argslen);                  // memory for concatenation
        if (inp == NULL)
            fatal("Memory allocation error");
        strcpy(inp, argv[1]);                   // prime with first arg
        for (i=2; i<argc; i++) {                // concat other args
            strcat(inp, " ");
            strcat(inp, argv[i]);
        }
    
        rev = strdup(inp);                      // make a copy
        if (rev == NULL)
            fatal("Memory allocation error");
        strrev(rev);                            // reverse the copy
        printf("Testing: \"%s\"\n", inp);
        if (stricmp(inp, rev) == 0)             // case insensitive test
            printf("Is a palindrome\n");
        else
            printf("Not a palindrome\n");
        free (inp);                             // release mine
        free (rev);                             // release library's
        return 0;
    }
    
    void fatal(char *msg) {
        printf("%s\n", msg);
        exit (1);
    }
    

    节目结果:

    >test Able was I ere I saw Elba
    Testing: "Able was I ere I saw Elba"
    Is a palindrome
    

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2011-03-27
      • 2014-06-03
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多