2012-05-30 67 views
0

編輯:顯然我必須在pigLatin方法的開頭首先聲明char *,並在方法的後面將其初始化爲& 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):error C2143:syntax error:missing';'之前的 'type'

1> programone.c(25):錯誤C2065:第一':未聲明的標識符

1> programone.c(25):錯誤C2100:非法間接

== ========構建:0成功,1失敗,0最新,0跳過==========

我不明白爲什麼我的指針爲第一個陣列「你好」的字符打印不正確。

在此先感謝!

+2

如果你把警告級別上你的編譯器,你會發現,這將不會編譯(或至少應該得到警告消息)。 –

+0

不應該是'&word [counter]'? – BeemerGuy

+0

@OliCharlesworth:這就是我一直在得到的。具體的錯誤是: 1> programone.c(23):錯誤C2143:語法錯誤:缺少';' ''''之前'type' 1> programone.c(24):error C2065:'first':未聲明的標識符 1> programone.c(24):錯誤C2100:非法間接尋址 – kkSlider

回答

1

您當前正在告訴編譯器指向first的值爲word[counter],這意味着它指向內存中某處奇怪的地方。你想在數組的第一個元素是指向,所以你需要更換:

char *first = word[counter]; 

有:

char *first = &word[counter]; 

或:

char *first = word; 

編輯 - 編譯錯誤你在你的評論中提到了與你的源代碼相關的23條線。在上面發佈的示例中,少於23行。因此,eror必須在你不在這裏公佈一些額外的代碼...

EDIT2 - 一對夫婦的小的調整,你的代碼看起來像它的作品對我說:http://codepad.org/73BKMSgv

+0

是的,我剝離了我的原始代碼到錯誤發生的地方,以便觀衆不需要看到無關的代碼。現在我知道這是一個壞主意,並修復了我原來的帖子。 – kkSlider

+0

我想我使用的是C編譯器的老版本,因爲它仍然給我一個編譯器錯誤,除非我在方法的開頭聲明瞭我的變量。我正在使用最新版本的Visual Studio(2010),所以我不明白爲什麼會發生此問題。 – kkSlider

3

你是不是指定您的指針變量指向第一個字符的地址。您將字符本身的值分配給指針變量,這就是編譯器錯誤的原因。

你需要改變這一行:

char *first = word[counter]; 

要這樣:

char *first = &word[counter]; 

或者,只是這樣做,而不是:

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

更新:即使代碼確實編譯過,這很危險。有關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):error C2065:'first':未聲明的標識符 1> programone.c(24):錯誤C2100:非法間接 – kkSlider

+0

@kkSlider:嘗試下面的代碼:http:// ideone.com/nY6f4,這是Remy對你的代碼所做的改變的結果。還要刪除特定於DOS的行,以便讓它在ideone上編譯,但它們應該與您報告的錯誤消息無關。 –

+1

@kkSlider:然後你又犯了上面示例代碼中沒有顯示的另一個錯誤。如果我將這些建議中的任何一個應用到您的原始代碼中,它將編譯並正確運行MSVC++ 2010. –

2

這條線的位置:

char *first = word[counter]; 

應該是這一個,而不是:

char *first = &word[counter]; 

由於您指向的是指針所指向的值,而不是內存地址本身,因此要獲取實際值,需要在調用數組前調用&符號。

0

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

輸出:
牛逼