2016-07-02 17 views
1
int main(int argc, char **argv){ 

    char Q[MAXCHAR]; 
    Q=argv[k+1];} 

Qは配列であり、argv [k + 1]はポインタです。 argv [k + 1]の内容をQにどのように取得できますか?argv [k]を別の文字列にするには?

+0

ポインタと配列は、実際には、同じものです。 'strcpy'が必要です。 – Sulthan

+5

@Sulthanポインタと配列が同じではありません。配列は、特定の状況でポインタに崩壊します。それで全部です。 –

+0

@underscore_d Cの配列は、先頭へのポインタによって識別される連続したメモリのチャンクではありませんか? – Sulthan

答えて

0

あなたは(編集後:最初のバージョンをお勧めはstrncpyを)snprintf

snprintf(Q, MAXCHAR, "%s", argv[k]); 

を使用することができます。

+0

'strncpy'は決してあなたが望むものではありません。切り詰めたコピー(それ自体が疑わしいメソッド)を望むなら、 'snprintf'を使います。 – melpomene

+0

@melpomene:この場合、なぜ 'strncpy'は推奨されませんか? – Louen

+0

'strncpy'は決して使用しないでください。それは変なものを行い、それは誤った名前になります(例えば、他の 'str *'関数とは異なり、Cの文字列を扱わない)。 – melpomene

0

Q = argv[k+1]を直接割り当てることはできません。配列(Q[MAXCHAR])の場合、arrayname(Q)がベースアドレスです。配列のベースアドレスは変更できません。 k = 0と仮定すると、あなたはARGVを取得するには、次のいずれかを使用することができます[1] Q.へのデータ

memmove(Q, argv[1], strlen(argv[1]) + 1); 

または

snprintf(Q, strlen(argv[1]) + 1, "%s", argv[1]); 

または

strncpy(Q, argv[1], strlen(argv[1]) + 1); 

または

memcpy(Q, argv[1], strlen(argv[1]) + 1); 

ここか

sprintf(Q, "%s", argv[1]); 

または

strcpy(Q, argv[1]); 

プログラムがあり、それはMEMMOVEを使用して出力です:

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

#define MAXCHAR 20 

int main(int argc, char **argv) 
{ 
    if (argc < 2) { 
     puts("Not enough arguments"); 
     return -1; 
    } 
    char Q[MAXCHAR] = {0}; 

    memmove(Q, argv[1], strlen(argv[1]) + 1); 
    puts(Q); 
    return 0; 
} 

出力:

[email protected]:~$ ./a.out stackexchange 
stackexchange 
関連する問題