需要关于在C、命令行参数中编写不同的循环的建议吗

需要关于在C、命令行参数中编写不同的循环的建议吗,c,cs50,C,Cs50,我想写一个代码,如果用户输入一个非数字的命令行参数,就会弹出一条“用法:./caesar key\n”的消息 目前我只能接受一个好的命令行参数。问题是当用户在printf中键入多个字符(“Success\n”);和printf(“%s\n”,argv[1]);不断重复 我还希望,如果用户输入例如:“12x”,他们会收到一条错误消息“用法:./caesar key”,而不是循环给我“success”、“12x”、“success”、“12x”和“用法:./caesar key” 例如: ~/wor

我想写一个代码,如果用户输入一个非数字的命令行参数,就会弹出一条“用法:./caesar key\n”的消息

目前我只能接受一个好的命令行参数。问题是当用户在printf中键入多个字符(“Success\n”);和printf(“%s\n”,argv[1]);不断重复

我还希望,如果用户输入例如:“12x”,他们会收到一条错误消息“用法:./caesar key”,而不是循环给我“success”、“12x”、“success”、“12x”和“用法:./caesar key”

例如: ~/workspace/pset2/caesar/$。/caesar 12x=> 成功 12倍 成功 12倍 用法:./caesar键

我希望它只能是“用法:./caesar key”,而不是在只有一个非数字的情况下打印出来

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdbool.h>

int main(int argc, string argv [])
{
    if (argc == 2)
    {
        int n = strlen(argv[1]);
        for (int i = 0; i < n; i++)
        {
            if (isdigit(argv[1][i]))
            {
                 printf ("Success\n");
                 printf ("%s\n", argv[1]);
            }
            else
            {
                printf ("Usage: ./caesar key\n");
            }
        }
    }
    else
    {
        printf ("Usage: ./caesar key\n");
    }
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符串argv[])
{
如果(argc==2)
{
int n=strlen(argv[1]);
对于(int i=0;i
您的代码只对一个命令行参数起作用,因为总参数是两个。要回答您的问题,您还需要打印
Success
,每当您发现一个字符是数字时,您可能需要做的是检查,如果您想使用这种方法,如果每个字符不是数字,那么您可以终止。您还可以使用
strspn()
,检查字符串中的数字,如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void usage(void)
{
    fprintf(stderr,"Usage: ...\n");
    return;
}

int main(int argc, char **argv)
{

    int i = 1; /* Ignoring executable name */
    char *digits = "0123456789";

    if (argc >= 2)
    {
        for (; i < argc; i++)
        {
            if ((strlen(argv[i]) != strspn(argv[i], digits))) /* Checking if the length of the string is not equal to the matched numbers */
            {
                fprintf(stderr, "Invalid argument %s\n", argv[i]);
                usage();
                exit(EXIT_FAILURE);
            }
        }
    }
    else
    {
        fprintf(stderr, "Invalid number of arguments\n");
        usage();
        exit(EXIT_FAILURE);
    }
    

    return 0;
}
#包括
#包括
#包括
无效用法(void)
{
fprintf(标准,“用法:…\n”);
返回;
}
int main(int argc,字符**argv)
{
int i=1;/*忽略可执行文件名*/
char*digits=“0123456789”;
如果(argc>=2)
{
对于(;i

基本上,您检查字符串的长度是否不等于
子字符串的长度,该子字符串可以包含字符串
中的任何数字
,如果长度相等,您就知道字符串实际上只由数字组成。有关strspn()的详细信息,请参见以下方法:

  • 如果使用
    bool
    类型,则声明一个初始化为
    1
    true
    标志
    变量

  • 使用循环检查不需要的条件,如果满足,则将
    标志设置为
    0
    false
    ,并中断循环

  • 循环结束后,使用条件
    if(flag)
    进行操作,以防一切正常

int标志=1;
对于(int i=0;i

当然,您可以根据自己的喜好命名
标志
int onlyDigits=1
with
if(onlyDigits)
将产生更可读的代码。

您到底在问什么?如果我理解正确,您需要检查每个命令行参数中是否有非数字字符?不断重复。你是说它永不停止?显示的代码不会打印每个数字字符。如果只希望打印一次,则将其置于
for
循环之外,并在第一个
else
案例中添加
return
int flag = 1;
    
for (int i = 0; i < n; i++) {

    if( !(isdigit(argv[1][i])) ) {
        
        printf ("Usage: ./caesar key\n");
        flag = 0;
        break;
    }
}
    
if( flag ) {
        
    printf ("Success\n");
    printf ("%s\n", argv[1]);
}