2012-02-07 52 views
2

我試圖找出爲什麼這不起作用:如何在C中指定子串?

#include <stdio.h> 
int main() 
{ 
    char *orig = "Hey you guys."; 
    char *str; 
    str = &orig; 
    while(*str++) { 
    if (*str == 'y') 
     *str = '@'; 
    } 
    puts(orig); 
    return 0; 
} 
// OUTPUT => "Hey you guys." 
// Not "[email protected] @ou [email protected]" as expected. 

通過分配海峽= &原稿,我認爲海峽將共享相同的內存地址原稿。 我錯過了什麼?

回答

2

(1)用於共享你想要做的內存str = orig,因爲str已經是一個指針類型。
(2)orig被定義爲字符串文字,恆定 - 所以你經由str訪問時,它不能修改"Hey you guys.",甚至不存在,它將導致運行時錯誤。

編輯:問題#3:在你的while循環中,你首先增加指針,然後檢查它是否是'y'並修改。通過這樣做 - 你會錯過第一個元素。如您所料,"yasdf"將變成"yasdf"而不是"@asdf"。 [好,我認爲你期待什麼呢...]

要實現你是什麼後,你可以按照這個:使用strcpy和緩衝,以避免寫在常量內存]

#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    char *orig = "Hey you guys."; 
    char buff[14]; //the length of orig + 1 byte for '\0' 
    char *str = buff; //since str and buff are already pointers 
    strcpy(str,orig); 
    while(*str) { 
    if (*str == 'y') 
     *str = '@'; 
    str++; 
    } 
    puts(buff); 
    return 0; 
} 
2

兩件事情:

  • &orig是指針的地址。也許你想要str = orig。你的編譯器應該在這裏警告你一個指針類型不匹配;如果沒有,那麼調高警戒級別直到它達到。
  • 修改常量字符串並不總是可行的。使用char orig[] = "Hey you guys.",它將文字字符串複製到名爲orig的數組中,您可以安全地進行修改。
0
  1. 你錯過了第一個元素
  2. 你不能改變一個字符串
  3. 修改後的代碼:
#include <stdio.h> 

int main() 
{ 
    char orig[] = "Hey you guys."; 
    char *str; 
    str = orig; 
    int i; 
    while(*str){ 
     if (*str == 'y') 
      *str = '@'; 
     *str++; 
    } 
    puts(str); 
    puts(orig); 
    return 0; 
}