撰寫一個在命令列提示符下最多接受六個引數的 C 程式。程式應該列印任何奇數引數的第一個字符,以及任何偶數引數的最后一個字符。列印的字符應以空格分隔。如果提供的引數少于兩個或多于六個,程式應告知用戶正確的程式用法。假設每個引數至少包含兩個字符。例如
應該列印這個:
給定引數: myprog arg1 200 list all arg5
回傳:m 1 2 ta 5
如何讓我的代碼列出按名稱輸入的引數以及偶數引數的最后一個字符?
#include<stdio.h>
int main(int argc,char* argv[])
{
int counter;
//here in c always one argument is ./a.out so we will check counting one extra
//argc contains the number of argument passed
//argv contain all the arguments
if(argc<3 || argc>7)
{
//invalid number of arguments
printf("\nplease pass appropriate number of command line attributes");
}
else
{
//printing all the arguments
printf("\nName of arguements passed: %s\n", argv[counter]);
//looping through all argumnets
for(counter=0;counter<argc;counter )
{ //if is at even place but here odd as numbering from 1
if(counter%-1==0){
printf("%c ",argv[counter][0]);
}
//odd place
else
{
printf("%c ",argv[counter][0]);
}
}
}
return 0;
}
我的代碼正在列印:
通過的引數名稱:myprog
. ma 2 laa
uj5u.com熱心網友回復:
您需要使用該函式strlen(<str>)來計算字串的長度以獲取最后一個字母(確保結果為 -1)。strlen函式來自<string.h>
快速說明 0:
當您counter在 for 回圈中設定為 0 時,您實際上包含a.out作為引數(將其更改為counter=1)并更改(counter%-1==0)為(counter%2==1)
由于注釋不再相關
快速說明 1:
如果傳遞了無效數量的 args 洗掉縮進級別,您可以通過退出來清理代碼
if(argc<3 || argc>7)
{
//invalid number of arguments
printf("\nplease pass appropriate number of command line attributes");
return 1; // 1 means an error occured
}
// rest of code here
快速說明 2:
您宣告counter但未初始化它意味著printf("\nName of arguements passed: %s\n", argv[counter]);具有未定義的行為,counter可能是任何東西。要解決此問題,請將宣告更改為counter = 0或更改argv[counter]為argv[0]. 否則,代碼有時會導致段錯誤。
快速注釋 3(對不起):
'\n' 應該放在列印陳述句的末尾而不是開頭。通過將它們放在開頭,您可以使輸出的格式非常奇怪
> ./a.out myprog arg1 200 list all arg5
Name of arguements passed: ./a.out
. m a 2 l a a 13 >
最終代碼:
#include<stdio.h>
#include<string.h>
int main(int argc,char* argv[])
{
int counter = 0;
//here in c always one argument is ./a.out so we will check counting one extra
//argc contains the number of argument passed
//argv contain all the arguments
if(argc<3 || argc>7)
{
//invalid number of arguments
printf("please pass appropriate number of command line attributes\n"); // new line is added at the end
return 1;
}
//printing all the arguments
printf("Name of arguements passed: ");
for(counter=0;counter<argc;counter ) // loop through each argument and print it
{
printf(argv[counter]);
putchar(' '); // put a space between each arg
}
putchar('\n'); // add new line to the end
//looping through all argumnets
for(counter=1;counter<argc;counter )
{ //if is at even place but here odd as numbering from 1
if(counter%2==1){ // used to be (counter%-1==0)
printf("%c ",argv[counter][0]);
}
//odd place
else
{
printf("%c ",argv[counter][strlen(argv[counter]) - 1]);
}
}
putchar('\n'); // add new line to the end
return 0;
}
輸出
> ./a.out
Name of arguements passed: ./a.out myprog arg1 200 list all arg5
m 1 2 t a 5
uj5u.com熱心網友回復:
這個for回圈
for(counter=0;counter<argc;counter )
{ //if is at even place but here odd as numbering from 1
if(counter%-1==0){
printf("%c ",argv[counter][0]);
}
//odd place
else
{
printf("%c ",argv[counter][0]);
}
}
至少是不正確的,因為變數 counter 的初始值應該等于 1。argv[0]不是用戶提供的引數。
還有 if 陳述句中的條件
if(counter%-1==0){
沒有意義。好像有錯別字。
回圈可以如下所示
#include <string.h>
//...
for ( counter = 1; counter < argc; counter )
{
if ( counter % 2 != 0 )
{
printf( "%c ", argv[counter][0] );
}
else
{
printf( "%c ", argv[counter][strlen( argv[counter] ) - 1] );
}
}
雖然像這樣撰寫回圈會更安全
for ( counter = 1; counter < argc; counter )
{
if ( *argv[counter] )
{
if ( counter % 2 != 0 )
{
printf( "%c ", argv[counter][0] );
}
else
{
printf( "%c ", argv[counter][strlen( argv[counter] ) - 1] );
}
}
}
因為用戶可以指定一個空字串“”作為命令列引數。
uj5u.com熱心網友回復:
代碼太多。到許多可能出錯的地方。
整個“偶數/奇數”問題都是一個問題。您是從 1 還是從 0 開始對引數進行編號?下面的代碼使用 OP 的示例輸出作為參考。
// myprog.c - an assignment
#include <stdio.h>
#include <string.h>
int main( int argc, char *argv[] ) {
if( 2 <= argc && argc <= 6 ) // corresponds to problem statement
; // all good!
else {
// "The program should inform the user of the correct program usage"
printf( "Number of arguments must be 2-6\n");
return 1;
}
printf( "Given arguments: ");
for( int i = 0; i < argc; i )
printf( "%s ", argv[ i ] );
putchar( '\n' );
for( ; argc; argc--, argv )
printf( "%c ", argv[0][ (argc % 2) * (strlen(*argv) - 1) ] );
putchar( '\n' );
return 0;
}
Given arguments: myprog arg1 200 list all arg5
m 1 2 t a 5
而且,似乎其他提供的答案不包括程式的名稱作為“引數”,如 OP 所需的輸出所示......嗯......“myprog”是執行的可執行檔案的名稱嗎?我認為是為了理解術語“arg1”和“arg5”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/512357.html
