2012-09-09 54 views
3

我原來是一個Java程序員,他現在正在努力與C和特別是C的指針。指針之謎/ noobish問題

我的想法是從命令行接收一個字符串,從用戶到字符指針。然後我想訪問它的各個元素。這個想法稍後將設計一個能夠顛倒元素順序的函數。 (我想在文本字謎工作。)

我的代碼是

#include <stdio.h> 

char *string; 


int main(void) 
{ 
printf("Enter a string: "); 
scanf("%s\n",string); 
putchar(*string); 

int i; 
for (i=0; i<3;i++) 
{ 
    string--; 
} 
putchar(*string); 

} 

(對不起,代碼標記不工作)。 我想要做的是在訪問單個元素時有第一步。如果字符串是「Santillana」,並且指針設置在最開始處(在scanf()之後),則內容*字符串應該是S.如果我不知道指針應該設置爲'\ 0'在scanf()之後,備份幾個步驟(字符串 - 重複)應該以字符串的形式產生一些東西。但是,這兩個putchar()都會產生分段錯誤。

我正在做一些根本性的錯誤,而一些根本的東西已經逃脫了我。我會永遠感謝任何關於我的缺點的建議,其中大部分是關於這些特定問題的書籍/資源的任何提示。至此,兩本厚厚的C書和參考手冊證明是無用的。

+0

如果您仔細閱讀,這些書不會被證明無效。 –

回答

7

您尚未爲字符串分配空間。你需要這樣的東西:

char string[1024]; 

你也不應該遞減變量string。如果它是一個數組,你不能這樣做。

你可以簡單地做:

putchar(string[i]); 

或者你可以使用指針(所提出的陣列):

char *str = string; 

for (i = 0; i < 3; i++) 
    str++; 

putchar(*str); 

但是你可以縮短這個循環到:

str += 3; 

或簡單地寫:

putchar(*(str+3)); 

等等


你應該檢查scanf()是成功的。您應該限制輸入字符串的大小,以避免緩衝區(棧)溢出:

if (scanf("%1023s", string) != 1) 
    ...something went wrong — probably EOF without any data... 

注意%s跳過前導空格,然後讀取字符直到下一個空格(「字」的簡單定義)。將格式字符串添加到格式字符串中幾乎沒有區別。您可以改爲"%1023[^\n]\n";它會查找多達1023個非換行符,然後換行。

你應該開始避免全局變量。有時候,它們是必要的,但不是在這個例子中。

+0

非常有價值 - 謝謝!但是你的解決方案將我限制在一個普通的字符數組中,並且具有預定的大小。我認爲C允許在運行時用'char * string'方案來解決這個問題,字符串的大小未聲明?或者,你是否可以將這個想法排除在外?因爲在這種情況下,我會根據您的建議去做,而不用擔心我可能會跳過代碼使用中令人討厭和困難的部分。 – Santillana

+3

是的,你可以使用動態分配的內存(使用''的'malloc()'等),或者你可以使用指向其他內存的指針。你的麻煩之一是'string'被初始化爲零或空,這是一個無效的指針(通常,如果你試圖通過空指針讀或寫,你的程序崩潰)。使用任何指針,知道它指向某個地方以及該空間有多大是至關重要的。 C中沒有發生的事情是任何形式的魔法內存分配;你負責內存分配。 –

0

在旁註中,使用scanf(3)是不好的做法。您可能需要查看fgets(3)或避免與scanf(3)相關的常見缺陷的類似函數。