2012-01-25 2 views
-2

질문은 매우 간단합니다. char[]을 C에서 char*으로 변환하려면 어떻게해야합니까? 정말 해결책을 찾기가 힘듭니다. 그래서 당신의 도움이 매우 감사합니다 :) 난이 필요한 이유C에서 char []을 char *로 변환하는 방법은 무엇입니까?

다음

은 다음과 같습니다

sprintf(name,"%c%c%%HACKED%c%c.virus",a,b,c,d); // print a formatted text to string (char[]) 
strcat(buffer,currentPath); // currentPath is of data type char[] 
strcat(buffer,"\\"); 
strcat(buffer,name); // Now this is where the problem comes in. Since strcat function needs a const char* for it's second argument. 

printf("%s",name); 
+1

작동하지 않습니까? 내 말은, 마지막 strcat? 나는 놀랄 것이다. 'name'은 진짜 char []입니다, 네? 당신은 그 정의를 포함하지 않았습니다. 그렇지 않으면'printf'도 실패합니다. –

+13

Pro Tip : 확장명이 .virus 인 바이러스의 이름을 지정하지 마십시오. – aardvarkk

+1

알다시피, 뇌 활성화가 실패합니다. 나는 단지 "문자열 const, 무엇이든간에"심지어 내용의 영어 의미를 처리하지 않았다. 아마도 나는'strcat'의 사용과 스케치 포인터의 사용을 옹호해야 할 것입니다 :-) ++ @ aardvarkk – BRFennPocock

답변

5

당신은 아무것도 할 필요가 없습니다. 배열이 자동으로 포인터로 쇠퇴하므로 코드가 정상적으로 나타납니다.

처음으로 strcat()을 호출하기 전에 buffer이 유효한 NUL 종료 문자열로 시작해야합니다. 또한 쓰기 가능해야합니다 (예를 들어, 문자열 리터럴에 대한 포인터 일 수는 없습니다).

또한 buffer을 오버플로하지 않아야합니다. 나는 당신을 strncat()에 들여다 보길 권한다.

+0

음, OP의 "여기가 문제가있는 곳"을 읽었습니다. "여기에 컴파일러 오류가 있습니다." –

+0

strncat()은 좋지 않은 조언입니다. 항상. – wildplasser

+0

감사! 어리석은 .. .. 방금 버퍼를 오버플로했는데 그것이 내 목적에 효과가 없었던 이유입니다. – Raven

1

나는 코드가 같은과 버퍼를 선언했다 있으리라 믿고있어 : 질문의

 char buffer[100]; 
    char name[100]; 

일부가 아닙니다,하지만 새로운 코드에 strcat사용하지 마십시오. 못. strncat을 확인하십시오. 그것은 은 정말 위험합니다strncat (만큼).

name은 마치 char* 인 것처럼 사용할 수 있습니다. C 컴파일러는이를 자동으로 &(name[0])의 (이에 해당하는) 논리로 변환합니다.

+0

'strcat'도 마찬가지로 위험합니다. 'strncpy','sprintf' 등 모든 잠재적 인 segfault가 있습니다. –

1

왜 바보 같은 strcat() 건가요? 왜 안돼 :

sprintf(name,"%c%c%%HACKED%c%c.virus",a,b,c,d); 
sprintf(buffer,"%s\\\\%s", currentPath, name); 

    /* should this be printf("%s", buffer); ?? */ 
printf("%s",name); 

그리고 BPRcock이 말한 것처럼 : snprintf()는 훨씬 좋습니다.

+0

또는 단지'sprintf (버퍼, % s \\ % c % c %% GEHAKT % c % c.virus ", currentPath, a, b, c, d); –

+1

예, 이름 부분과 함께 특별한 계획을 가졌습니다. – wildplasser

1

C에서 char [N] 유형의 객체 값은 char * 유형으로 변환됩니다. 표현 문 p = a;a에서

void *p; 
char a[16] = {0} 

p = a; 

유형 char *이다.

"는 연산자를 sizeof 또는 & 단항 연산자의 연산, 또는 어레이를 초기화하는 데 사용되는 문자열 상수, 입력이있는 경우를 제외 표현"(C99, 6.3.2.1p3)의 배열 type "은 배열 객체의 초기 요소를 가리키며 lvalue가 아닌"type to pointer "유형의 표현식으로 변환됩니다."

관련 문제