0

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

我有初始数组设置和工作,下面的 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;
}
4

1 回答 1

0

你不需要从任何地方复制你的字符串......来自命令行,你会让它们坐在里面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] );
}
于 2012-09-18T23:39:31.933 回答