【问题标题】:Using command line in C to detect arguments, and then print out the first or second char of the arguments在 C 中使用命令行检测参数,然后打印出参数的第一个或第二个字符
【发布时间】:2012-09-11 06:21:22
【问题描述】:

我需要制作一个程序,在命令行中接受不少于 2 个且不超过 6 个参数,然后打印出第一个或第二个字符 例如: asdf asdf asdf asdf 输出为:a s a s

我有初始数组设置和工作,下面的 for 循环是为了在输入中的一个空格处切断字符串并将其复制到一个新字符串,但它不能正常工作。我是 C 和这个网站的新手。非常感谢任何帮助。

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

int main(){

char a[50];
char b[50];
char c[50];
char d[50];
char e[50];
char f[50];

int i;

printf("enter a string (Ex: asdf asdf asdf... Must have atleast 2 arguments but no more than six): ");
scanf("%s", a);
printf("%c", a);

for (i = 0; i != 50; i++){

      if(a[i]==' '){
      char strncpy(b, &a[i], i+2);
      printf("\n%c ",a[1]);
      printf("%c ",b[0]);
      }
}
for (i = 0; i != 50; i++){    
      if(b[i]==' '){
      char strncpy(c, &b[i], i+2);
      printf("%c ",c[1]);
      }
}
for (i = 0; i != 50; i++){    
      if(c[i]==' '){
      char strncpy(d, &c[i], i+2);
      printf("%c ",d[0]);
      }
}
for (i = 0; i != 50; i++){    
      if(d[i]==' '){
      char strncpy(e, &d[i], i+2);
      printf("%c ",e[1]);
      }
}
for (i = 0; i != 50; i++){    
      if(e[i]==' '){
      char strncpy(f, &e[i], i+2);
      printf("%c ",f[0]);
      }
}
return 0;
}

【问题讨论】:

  • 我错过了什么吗?当您说“在命令行传递参数”时,我希望您谈论的是传递给main()argv 数组。不是这样吗?我已经准备了一个假设是的答案,但也许你可以先澄清一下。
  • 是的,这就是我应该做的。然而,我只是在一段时间后尝试这样做
  • 嗯,我看到您已经编辑了您的问题,以便您从控制台而不是命令行读取。在你说这就是你真正想要做的事情之后,我发布了我的命令行答案。如果这不是你的意思,我会删除它。
  • 我实际上并不完全确定老师想要什么,这本书也对每个问题都说命令行,但是老师已经接受了不使用命令行的程序。您的回答很好,感谢您的帮助!

标签: c strncpy


【解决方案1】:

你不需要从任何地方复制你的字符串...从命令行你可以让它们坐在argv

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

}

其中argc 是参数总数加1(第一个是调用程序的名称),argv 是指向每个参数字符串的指针数组。这些已经从命令行进行了标记。

所以首先你要测试你有足够的论据。我喜欢明确地创建一个新变量,以消除比较中的逐一混淆:

int nparams = argc - 1;
if( nparams < 2 || nparams > 6 ) {
    printf( "Wrong number of arguments\n" );
    return -1;
}

然后你循环你的论点。第一个将位于数组的位置 1... 从您的示例中,您似乎打印了第一个参数的第一个字符,以及下一个参数的第二个字符,然后继续交替。这是一个模运算。我有一个变量which,用于选择要打印的字符。

int i, which;
for( i = 1; i <= nparams; i++ ) {
    which = (i-1) % 2;
    printf( "%c\n", argv[i][which] );
}

这确实假设每隔一个参数至少有两个字符长。没有错误检查。如果您需要错误检查,您需要确保您正在打印的字符不是字符串终止符(值 0)。在第二个字符的情况下,您还需要在它不为0之前检查该值。我不知道是否可以指定一个零长度的字符串的参数。也许知道的读者可以发表评论。

好吧,我不妨把它放进去……所以你的循环看起来有点像这样:

if( argv[i][0] == 0 || argv[i][which] == 0 ) {
    printf( "\n" );
} else {
    printf( "%c\n", argv[i][which] );
}

【讨论】:

  • 谢谢你,你是救命稻草!
猜你喜欢
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2014-04-07
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多