gpt4 book ai didi

c - 扫描并确定在命令提示符中输入的参数! (过得很辛苦)

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:54 24 4
gpt4 key购买 nike

快速编辑:这是一项家庭作业。我的目“-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);
}

}

最佳答案

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

这使得 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 链 block 和 strcmp () 没问题。

警告!

你将不能用这个指定任意文件名!如果您从 main() 中获取参数,它们将被转换为您当前使用的任何代码页,这对于几乎任何目的来说都是非常糟糕的。 (如果您是唯一一个使用该程序的人,可能没问题。)

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

关于c - 扫描并确定在命令提示符中输入的参数! (过得很辛苦),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13756333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com