2015-04-26 107 views
0

我有一個在末尾有一些空格的字符串。我想在第一個空格出現的位置終止這個字符串,這樣當我稍後對它執行strncpy()時,它將只複製不包含空格的字符串部分。在C中終止一個字符串

這是一些嘗試,顯然給了我一個呃。我怎麼能做我打算做的事情?

int main() { 
    char* s1 = "SomeString    "; 
    *(s1 + 10)='\0'; 
    printf("%s\n",s1); 

    return 0; 
} 
+0

'puts(strncpy(s2,s1,10));'將在此處起作用。 –

+3

段錯誤是由於's1'指向一個字符串,它被分配在只讀存儲段中。嘗試寫入此段導致內存訪問衝突。這就是說,你可以爲你的目的使用'strtok'(再次,只要你的字符串被分配在一個可寫的內存段中)。 –

+0

@naltipar:我不是低調的選民,但我會在那裏擺脫那個'50'。另外,反對票的一個很好的理由可能是你已經顯示了一個非常「硬編碼」的例子,說明如何在索引「10」處截斷該字符串。 –

回答

3

您試圖修改只讀的字符串,因爲您聲明它指向一個常量值的方式。你必須做一個備份:

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

int main() { 
    char* s1 = "SomeString    "; 
    char *s2 = strdup(s1); 
    char *s3 = strchr(s2, ' '); 
    *s3 = '\0'; 
    printf("%s\n",s2); 
    /* if not needed any more, because strdup allocates heap memory */ 
    free(s2); 

    return 0; 
} 
-1

也許可能的strstr在你的情況下(http://www.cplusplus.com/reference/cstring/strstr/

char * pFirstSpace = strstr (s1," "); 
if (pFirstSpace) *pFirstSpace=0; 

UPDATE

正如許多人都注意到了,這變成在訪問衝突有用。這僅在動態分配的字符上運行。因此,您需要在更改其內容之前將您的字符串複製到動態緩衝區中

5

像您在*(s1 + 10)='\0';中那樣修改文字字符串的內容是未定義的行爲。

1

你可以使用

char s1[] = "SomeString    "; 

,而不是

char* s1 = "SomeString    "; 
0

一個更廣義的例子,你居然找到第一個空格字符(如果有的話)。還要注意定義s1的方式的變化,以避免文字字符串(即"this")可能存儲在只讀存儲器中的問題。在你的例子中s1直接指向文字字符串。在字符串下面用於初始化數組s1。

int main() { 
     char s1[] = "SomeString    "; 
     char * spc = strchr(s1, ' '); 
     if (spc != NULL) *spc = '\0'; 
     printf("%s\n",s1); 

     return 0; 
    }