1

快速编辑:这是一个家庭作业。我的目标是为我的程序接收一些 cl 参数(-s、-w 与宽度长度和文件)并根据默认长度 40 个字符或用户选择的新数字换行文件'-w' 选项。

我正在尝试编写一个通过命令提示符接收参数的 C 程序(可执行文件名为“wrapfile.exe”)。该程序还没有完成,还有更多内容要添加,这只是它的一部分,它给我带来了混乱。

以下是有效命令提示符条目的示例:

C:\"within wrapfile.exe's directory"> wrapfile -s filename.txt
C:\"within wrapfile.exe's directory"> wrapfile -w 5 filename.txt
C:\"within wrapfile.exe's directory"> wrapfile -s -w 50 filename.txt

等等

无效条目示例:

C:\"within wrapfile.exe's directory"> wrapfile 
C:\"within wrapfile.exe's directory"> wrapfile -w
C:\"within wrapfile.exe's directory"> wrapfile qwer

等等

我的问题是在我输入“-w”后它无法检测到数字..

这是代码:

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "string.h"


int main(int argc, char *argv[])
{
int output = 0;
int commands = 1;
int wraplength= 41;
int i=0;
int counter=0;
int wordwrap = 0;
int ExitStatus = 1;
int input = 1;
int w = 0;
int s = 0;
FILE *f = NULL;


for (i=0; i < argc; i++)
{
    if ( (*argv[input] + i-1) == '-') // check for option
    {
        printf(" - detected first");
        if (*(argv[input] + i  ) == 's') // check for wordwrap
        {
            printf(" s detected");
            i++;
            i++;
            s = 1; // set s to true to that option can be added later
            wordwrap = 1; // set wordwrap on or true
        }   

        if (*(argv[input] + i) ==  'w')//if the second option is a w
        {
            i++;
            printf(" w detected ");
            sscanf ((argv[input] + i), "%d", &wraplength);
            printf ("%d", wraplength);
            if ( wraplength < 1) // check what the number is
                {
                    printf("Usage: wrapfile [-s] [-w width] file ...");
                    return 2; // command line options incorrect
                }               
        }

        if (*(argv[input] + i) == '-')
        {
            printf(" second - detected");
            i++;

            if (*(argv[input]+ i) ==  'w')//if the second option is a w
            {
                i++;

                if (sscanf ((argv[(input)+1]), "%d", &wraplength) != 1) // check what the number is
                {
                    printf("Usage: wrapfile [-s] [-w width] file ...");
                    return 2; // command line options incorrect
                }
            }
        }
    }
}
return 0;
}

大编辑:我接受了 Dietrich Epp 的建议,这是我用它做的事情。每次我尝试检查“-s”之后的参数时,我的程序似乎都会崩溃。如何在不使程序崩溃的情况下检查下一个参数(如果没有?)。我知道这条线与崩溃有关:

   arg = argv[i++];

这是代码:

while (i < argc) 
{
    arg = argv[i++];
    if (!strcmp(arg, "-s")) 
    {
        arg = argv[i++];
        son = 1; 
        printf("Have -s\n");
        if (!strcmp(arg, "-w"))
        {
            if (i >= argc)
            {
                printf("Usage: wrapfile [-s] [-w width] file ...");
            }
            param = argv[i++];
            wraplength = *param;
            printf("Have -w %s\n", param);
        }

    }
4

1 回答 1

1

我认为您在这里混淆了循环变量。

这会i遍历所有参数,包括 argv[0]您通常不想要的参数。

for (i=0; i < argc; i++)

i用作参数字符串之一的索引,但语法很有趣。

if (*(argv[input] + i  ) == 's')

在其他系统上,您只需使用getopt(),但这并不总是在 Windows 上的一个选项。

建议

你会想要一个更像这样的循环:

// Note: C99, so you will need to translate to C89 if you use Microsoft's
// C compiler
int i = 1;
while (i < argc) {
    char *arg = argv[i++];
    if (!strcmp(arg, "-s")) {
        printf("Have -s\n");
    } else if (!strcmp(arg, "-w")) {
        if (i >= argc)
            error();
        char *param = argv[i++];
        printf("Have -w %s\n", param);
    } else {
        error();
    }
}

命令选项解析与您的程序性能非常相关,以至于上面的if/else块链strcmp()很好。

警告!

您将无法使用它指定任意文件名!如果您从 获取参数main(),它们将被转换为您当前使用的任何代码页,这对于几乎任何目的都被严重破坏。(如果您是唯一使用该程序的人,那可能会很好。)

为了指定任意文件名,您需要调用GetCommandLineW()以 UTF-16 格式获取命令行,然后CommandLineToArgvW()将其解析为int argcwchar_t **argv.

于 2012-12-07T03:24:12.060 回答