c - 在C中使用命令行检测参数,然后打印出参数的第一个或第二个字符

标签 c strncpy

我需要制作一个在命令行接受不少于 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;
}

最佳答案

您不需要从任何地方复制字符串...来自命令行,您将把它们放在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] );
}

关于c - 在C中使用命令行检测参数,然后打印出参数的第一个或第二个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12486289/

相关文章:

c++ - 如何将更新的 git-hash 嵌入到 Version.hpp 中?

c - strncpy 导致 LPC-2378 挂起/死亡

c++ - 代码中 strncpy 到 strcpy 的等效性

检查缓冲区大小/strncpy

将字符串复制到 malloc 的字符串数组

c - 根据磁盘 ID 删除文件

服务器应用程序中的 C 内存管理

c - c中共享内存的重新分配

c - boost::bind 在 C 中等效?

c - C 中带有指针的 string.h 和 strncpy