2011-06-15 175 views
1

我在這裏試圖完成的是取一個cString並用另一個地方代替某個字符,這個地方是通過使用strchr()函數找到的。C指針算術

我無法弄清楚是如何替換字符我所有的嘗試(下面註釋掉)都會產生未經編輯的字符串或崩潰程序。我相信我正在朝着正確的方向去取代字符(取char * c的起始地址,並添加n(我想替換的字符前面的字節數),然後寫入該新地址),但我似乎無法讓它正常工作。

任何幫助表示讚賞。

int main() 
{ 
    char *c, *sch; 
    int n; 

    c = "this is a test\n"; 

    sch = strchr(c, 'a'); 

    if(sch != NULL) 
    { 
     n = sch-c+1; 

     printf("%d\n", (int)sch); 
     printf("%d\n\n", (int)c); 

     printf("'a' found at: %d", n); 
    } 

    ///////////////////// 
    //sch = &c; 
    //*(sch + n) = 'z'; 
    ///////////////////// 
    //*(c + n) = 'z'; 
    ///////////////////// 
    //c[n] = 'z'; 
    ///////////////////// 

    printf("\n\n%s", c); 

    getchar(); 
    return 0; 
} 

回答

2

編輯:首先,c應該是一個數組,而不是一個指向字符串字面量,因爲字符串常量存儲在只讀存儲器,並試圖修改它們通常會導致在崩潰。

所以,首先,

char c[]= "this is a test\n" 

這初始化一個修改字符串該值,你可以毫無問題編輯。

通常,您不應該直接將字符串文字分配到char *,因爲您可能會遇到這類問題;相反,只將它們分配給const char *,這樣任何修改嘗試都會導致編譯錯誤。


然後,strchr已經返回一個指向匹配的字符(如documentation說),你可以簡單地直接改變它,沒有指針運算涉及:

*sch = 'z'; 

不過,如果你想與指針運算實驗,有一個在定義的錯誤n

n = sch-c+1; 

如果然後使用它作爲一個字符串的索引,你應該刪除1,因爲數組(和字符串)是從零開始的。換句話說:如果您分配給n該值,下面的代碼:

*(c + n) = 'z'; 

(這相當於

c[n] = 'z'; 

是否意味着

*(c + sch - c + 1) 

那是,

*(sch+1) 

即跟在strchr找到的字符之後的字符。刪除+1將做的伎倆(雖然這只是一個簡單的說*sch='z'說)。

另一個嘗試是錯誤的,因爲在您的代碼&c將產生char **,即指向char的指針,這不是你想要的。

+0

'sch'指向只讀的字符串文字。 – 2011-06-15 22:03:18

+0

@Bertrand:對,我會解決答案。被分配給char *的事實讓我分心。 – 2011-06-15 22:04:39

1

在C中,引用的字符串是char *,但這並不意味着您可以對其進行修改。嘗試使用c作爲數組(char c [] = "this is a test\n";),或者甚至分配內存並複製文本。

1

在您的代碼中,c指向一個常量字符串(一個字符串文字)。修改它是未定義的行爲。你應該把它複製到一個字符數組中代替(如:

char c[] = "This is a test" 

你的第一次嘗試是註釋掉了需要的c地址,並把它變成sch - 即產生一個char**,這是不是你想要的。編譯器應該有回升,高達,順便說一句 - 或許打開一些警告

你的第二次嘗試應該是OK,而第三個是基本相同的事情

BTW:N應該是sch - c - 沒有。需要+ 1,和你在一起d初始化爲n以防萬一您找不到您要查找的字符。

+0

這是假設你想練習你的指針算術順便說一句 - 否則,請參閱Matteo的答案。 – rlc 2011-06-15 22:02:18

0

此處的問題不在您的指針算術中(儘管您要使它比需要的複雜,請參閱Matteo意大利的回答)。

你的問題是,下面的代碼不會做你認爲它的作用:

char *c; 

c = "this is a test\n"; 

此代碼創建的指針併爲其指派一個靜態字符串的地址。即使有Matteo的建議,你也不能修改靜態字符串。

要解決這個問題,你可以做兩件事之一。您可以將c聲明爲一個數組,並使用該字符串初始化它。您還可以讓c保持指針狀態,然後使用malloc分配緩衝區(將緩衝區的地址存儲在c中),然後使用strcpy將靜態字符串複製到緩衝區中。在那個時候,你應該可以像你試圖做的那樣操縱字符串。

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

int main() 
{ 
char c[80], *sch; 
int n; 


scanf("%s", c);printf("string %s \n", c); 
//c = "this is a test\n"; 

sch = strchr(c, 'a'); 

if(sch != NULL) 
{ 
    n = sch-c; 

    printf("%d\n", (int)sch); 
    printf("%d\n\n", (int)c); 

    printf("'a' found at: %d", n); 
} 

///////////////////// 
sch = &c; 
*(sch + n) = 'z'; 
///////////////////// 
*(c + n) = 'z'; 
///////////////////// 
c[n] = 'z'; 
///////////////////// 

printf("\n\n%s", c); 

getchar(); 
return 0; 

運行上面的字符串片段「這 - 是 - 一測試」

問題與您前面的代碼是字符串常量在只讀部分結束了,你無法修改它們。所以,將它寫爲 char c [] =「這是一個字符串」也不會有幫助。