c
2011-05-14 41 views 0 likes 
0

我在我目前正在學習的代碼中找到了這個,有人可以向我解釋它。通過做字符串搜索學習C

char * string = "Simulated Annealing = 12847369"; 
char * value = strchr(string, '='); 

*(value ++) = 0; 


printf("%s ==== %s", value, string); 

我注意到字符串會先打印一個新行,爲什麼這麼做?

char* karmarkar = "Karmarkar 958572"; 

我想使用strchr查找字符串karmarkar中第一次出現的「空格」。 我該怎麼做?

+1

此代碼具有未定義的行爲。 – 2011-05-14 11:38:23

+0

你可以用char * string = strdup(「....」)修復它;' – Alexandru 2011-05-14 11:40:25

回答

0

在第一種情況下,strchr將返回指向在string中找到'='的字節的指針。您不需要將0附加到返回的值,因爲它只是指向由string指向的字符數組的另一個指針,該指針已被空終止。要打印的字符,只是說value[0]

char* string = "Simulated Annealing = 12847369"; 
char* value = strchr(string, '='); 
if (value != NULL) 
    { 
    printf("value: %s, string: %s\n", value, string); 
    printf("char: %c\n", value[0]); /* prints = */ 
    } 

用同樣的方法找到第二個字符串中的空間:

char* karmarkar = "Karmarkar 958572"; 
value = strchr(karmarkar, ' '); 
if (value != NULL) 
    printf("value: %s\n", value); 

使用之前請務必檢查strchr的返回值,因爲它返回NULL如果該字符未找到。

順便說一下,聲明*(value ++) = 0應該會導致段錯誤,因爲它試圖修改只讀位置。如果你在一本聲稱教C的書中發現了這個代碼,我建議你放棄它並從this開始學習。如果您的編譯器生成的代碼打印該特定語句的換行符,則應該開始使用更好的編譯器。有幾個好的available for free download

2
  1. 不是,它不會放新行http://codepad.org/xhTiV4Qn。實際上,在我的機器上,它給出了sigsegv,因爲你正試圖在「Simulated ...」中的只讀位置寫入。
  2. int pos = strchr(karmarkar, ' ') - karmarkar;strchr(karmarkar, ' ')返回一個指向「」(空格)的第一次出現的指針。
1

該代碼首先計算'='字符的位置(作爲地址,而不是索引)。然後這個地址處的字符被設置爲0,並且值的地址被設置爲下一個符號。這使'string'在'='(現在爲0)之前結束,因爲它是0終止的,並且值在'='之後開始。因此,printf將打印出「12847369 ====模擬退火」(注意到空間仍然存在)。

對於你的第二個問題,它和亞歷山德魯在他的回答中指出的相似。

+0

然後我有其他問題。哪裏不期望使用只讀字符串? – user618677 2011-05-14 19:11:59

1

的所有

您定義string首先指向一個常量字符串中,存儲在只讀存儲器:

char * string = "Simulated Annealing = 12847369"; 

然後你發現這個的=第一次出現並將指針指向它在value

char * value = strchr(string, '='); 

所以value現在指向一個只讀存儲器或value = NULL,所以這是一個已經未定義行爲的一行:

*(value ++) = 0; // assign value to read-only memory 

如果讓我們說你寫

char string[] = "Simulated Annealing = 12847369"; 

你在陣列中存儲此字符串在堆棧上,然後你可以寫信給它。現在

,你的問題

您的代碼不會打印到新的生產線,如果你之前寫的東西,你會看到:

char string[] = "Simulated Annealing = 12847369"; 
char * value = strchr(string, '='); 
*(value ++) = 0; 
printf("First line"); 
printf("%s ==== %s", value, string); 

爲了找到第一發生的空間字符,使用strchar(karmarkar, ' '):

再次,當您使用strchr檢查返回值是否爲NULL,因爲它可能是,如果它確實是NULL,那麼您的程序可能會崩潰。(取消引用非法地址)

相關問題