2016-07-02 2 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

당신은 snprintf

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

이 (편집 : 첫 번째 버전 권장 strncpy에서)를 사용할 수 있습니다.

+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 
관련 문제