2012-05-30 3 views
0

EDIT : 분명히 pigLatin 메서드의 시작 부분에 char * first를 선언하고 메서드의 뒷부분에서 & word [counter]로 초기화해야했습니다. 왜이 사람이 누군지 압니까? Visual Studio 2010을 사용하고 있습니다.문자 배열의 첫 번째 문자를 가리키는 포인터?

왜 컴파일 타임 오류가 발생하는지 파악하는 데 문제가 있습니다. 문제의 코드 :

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

char *pigLatin(char *word) 
{ 
    if (word[0] == 'a' || word[0] == 'e' || word[0] == 'i' 
      || word[0] == 'o' || word[0] == 'u') 
    { 
     char yay[] = "yay"; 
     strcat(word, yay); 
     return word; 
    } 
    else 
    { 
     int length = strlen(word); 
     int counter = 0; 
     char addOn[] = ""; 
     char remainder[] = ""; 
     char yay[] = "yay"; 
     printf("%s", yay); 

     char *first = &word[counter]; 
     printf("%c", *first); // error is here, don't know why it doesn't print 
     return word; 
    } 
} 


int main() 
{ 
    char hello[] = "hello"; 
    pigLatin(hello); 
    printf("%s", hello); 
    getch(); 
    return (0); 
} 

1> ------ 빌드 시작 : 프로젝트 : Program_One, 구성 : 릴리스는 Win32 ------

1> programone.c

1> programone.c (12) : 경고 C4996 : 'strcat':이 함수 또는 변수가 안전하지 않을 수 있습니다. strcat_s를 대신 사용해보십시오. 지원 중단을 사용하지 않으려면 _CRT_SECURE_NO_WARNINGS를 사용하십시오. 자세한 내용은 온라인 도움말을 참조하십시오.

1> programone.c (24) : 오류 C2143 : 구문 오류 : ';'이 (가) 없습니다. 오류 C2065 : 첫 '선언되지 않은 식별자

1> programone.c (25) : 오류 C2100'타입 '

1> programone.c (25) 전에 불법적 간접

== ======== 빌드 : 0 성공, 1 실패, 0 최신, 0 건너 뛰기 ==========

왜 내 포인터가 첫 번째 배열 "hello"의 문자가 올바르게 인쇄되지 않습니다.

미리 감사드립니다.

+2

,이 컴파일되지 않습니다 (또는 적어도 경고 메시지를 얻어야한다) 것을 발견한다. –

+0

'& word [counter]'가 아니어야합니까? – BeemerGuy

+0

@OliCharlesworth : 그게 내가 얻은 것입니다. 특정 오류는 다음과 같습니다. 1> programone.c (23) : 오류 C2143 : 구문 오류 : ';'이 (가) 없습니다. '형식'전에 1> programone.c (24) : 오류 C2065 : '첫 번째': 선언되지 않은 식별자 1> programone.c (24) : 오류 C2100 : 불법 인디 케이션 – kkSlider

답변

1

현재 컴파일러에서 first의 값을 word[counter]으로 지정하면 컴파일러가 메모리의 이상한 곳을 가리키고 있음을 나타냅니다. 컴파일러 오류 -

char *first = word; 

편집 :

char *first = word[counter]; 

로 :

char *first = &word[counter]; 

하거나 교체 할 필요가 있도록 배열의 첫 번째 요소를 가리키는 싶은 당신은 귀하의 의견에 23,24 개의 소스 코드와 관련이 있다고 언급합니다. 위에 게시 한 예에서는 23 줄 미만입니다. eror 따라서 ... 당신이 여기에 게시하지 한 몇 가지 여분의 코드에 있어야합니다

는가

Edit2가 - 약간의 조정의 부부와 함께, 당신의 코드가 보이는 나에게 작동 : http://codepad.org/73BKMSgv

+0

그래, 원래 코드를 제거하여 뷰어가 불필요한 코드를 볼 필요가 없도록 오류가 발생한 위치로 옮깁니다. 지금 나는 그것이 나쁜 아이디어이고, 나의 최초의 지위를 고쳤다는 것을 배웠다. – kkSlider

+0

나는 C 컴파일러의 이전 버전을 사용하고 있다고 생각한다. 왜냐하면 나는 메서드의 시작 부분에 변수를 선언하지 않으면 컴파일러 오류가 발생하기 때문이다. 최근 버전의 Visual Studio (2010)를 사용하고 있으므로이 문제가 발생하는 이유를 알 수 없습니다. – kkSlider

3

당신은하지 않습니다 포인터 변수를 첫 번째 문자의 주소를 가리 키도록 지정합니다. 문자 자체의 값을 포인터 변수에 대입하면 컴파일러 오류가 발생합니다.단지 대신 이렇게

char *first = &word[counter]; 

또는 :

char *pigLatin(char *word) 
{ 
    int counter = 0; 
    printf("%c", word[counter]); 
    return word; 
} 

업데이트 : 경우에도 코드를 여기에

char *first = word[counter]; 

:

는이 라인을 변경해야 컴파일 했어. 위험하다. strcat()에 대한 컴파일러 경고가 유효합니다. 모음으로 시작하는 경우 입력 단어에 "yay"을 추가 할만큼 충분한 메모리를 할당하지 않았습니다. 정말이 코드를 안전하게하려면, 대신 원시 포인터의 std::string 클래스를 사용해야합니다 :

#include <conio.h> 
#include <string> 

std::string pigLatin(const std::string &word) 
{ 
    switch(word[0]) 
    { 
     case 'a': 
     case 'e': 
     case 'i': 
     case 'o': 
     case 'u': 
      return word + "yay"; 
    } 

    int length = word.length(); 
    int counter = 0; 
    //... 

    printf("%c", word[counter]); 
    return word; 
} 

int main() 
{ 
    std::string word = pigLatin("hello"); 
    printf("%s", hello.c_str()); 
    getch(); 
    return 0; 
} 
+0

그 일을하고 이러한 오류가 발생합니다 :> programone.c (23) : 오류 C2143 : 구문 오류 : 누락 된 ';' 'type'앞에 1> programone.c (24) : 오류 C2065 : '첫 번째': 선언되지 않은 식별자 1> programone.c (24) : 오류 C2100 : 잘못된 간접 참조 – kkSlider

+0

@kkSlider : http : // 코드 시도 ideone.com/nY6f4, Remy가 코드를 변경 한 결과입니다. 또한 DOS 전용 라인을 지우는 것만으로도 이상적으로 컴파일 할 수는 있지만,보고하는 에러 메시지와 아무 관련이 없어야합니다. –

+1

@kkSlider : 그런 다음 위의 샘플 코드에 표시되지 않은 또 다른 실수를했습니다. 이 제안 사항 중 하나를 원본 코드에 적용하면 MSVC++ 2010에서 올바르게 컴파일되고 실행됩니다. –

2
여기

이 줄 :

char *first = &word[counter]; 

인해 :

char *first = word[counter]; 

대신이 하나 여야합니다 포인터가 가리키는 값을 가리키고 메모리 주소 자체 대신 포인터를 가리키고 실제 값을 얻으려면 배열 호출 앞에 앰퍼샌드 기호가 필요합니다.

0

char str [] = "test";
char * p;
p = str;
printf (p [0]);

출력 : 당신이 당신의 컴파일러의 경고 수준을 설정하면
t

관련 문제