首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清理argv程序

清理argv程序
EN

Stack Overflow用户
提问于 2015-04-16 23:52:30
回答 3查看 351关注 0票数 0

我有一个argv c程序,它把单词颠倒过来,看它是不是回文。我只想清理输出,让它打印原始输入而不是反向输入,但由于它是argv,我似乎不知道如何做到这一点。

代码语言:javascript
复制
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");
}

我省略了其余的函数,但您可以在主要的printf中看到它是不是回文类型。不确定如何使其等于原始输入,并知道参数的数量。目前,它打印反转的字符串,而我认为打印原始字符串会更好。我想我把它弄得太难了,但我不确定。

EN

回答 3

Stack Overflow用户

发布于 2015-04-17 00:07:19

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

代码语言:javascript
复制
./program "a man a plan a canal panama"

而不是

代码语言:javascript
复制
./program a man a plan a canal panama

这样你就不需要遍历参数了。

票数 0
EN

Stack Overflow用户

发布于 2015-04-17 00:10:12

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

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

代码语言:javascript
复制
#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);
}

程序结果:

代码语言:javascript
复制
>test Able was I ere I saw Elba
Testing: "Able was I ere I saw Elba"
Is a palindrome
票数 0
EN

Stack Overflow用户

发布于 2015-04-17 00:17:42

我看到了两个问题:参数的数量是以argc表示的--关于argcargv[]的更多细节,请参见this question

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

代码语言:javascript
复制
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");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29679920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档