我有一個在末尾有一些空格的字符串。我想在第一個空格出現的位置終止這個字符串,這樣當我稍後對它執行strncpy()
時,它將只複製不包含空格的字符串部分。在C中終止一個字符串
這是一些嘗試,顯然給了我一個呃。我怎麼能做我打算做的事情?
int main() {
char* s1 = "SomeString ";
*(s1 + 10)='\0';
printf("%s\n",s1);
return 0;
}
我有一個在末尾有一些空格的字符串。我想在第一個空格出現的位置終止這個字符串,這樣當我稍後對它執行strncpy()
時,它將只複製不包含空格的字符串部分。在C中終止一個字符串
這是一些嘗試,顯然給了我一個呃。我怎麼能做我打算做的事情?
int main() {
char* s1 = "SomeString ";
*(s1 + 10)='\0';
printf("%s\n",s1);
return 0;
}
您試圖修改只讀的字符串,因爲您聲明它指向一個常量值的方式。你必須做一個備份:
#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;
}
也許可能的strstr在你的情況下(http://www.cplusplus.com/reference/cstring/strstr/)
char * pFirstSpace = strstr (s1," ");
if (pFirstSpace) *pFirstSpace=0;
UPDATE
正如許多人都注意到了,這變成在訪問衝突有用。這僅在動態分配的字符上運行。因此,您需要在更改其內容之前將您的字符串複製到動態緩衝區中
像您在*(s1 + 10)='\0';
中那樣修改文字字符串的內容是未定義的行爲。
你可以使用
char s1[] = "SomeString ";
,而不是
char* s1 = "SomeString ";
一個更廣義的例子,你居然找到第一個空格字符(如果有的話)。還要注意定義s1
的方式的變化,以避免文字字符串(即"this"
)可能存儲在只讀存儲器中的問題。在你的例子中s1
直接指向文字字符串。在字符串下面用於初始化數組s1。
int main() {
char s1[] = "SomeString ";
char * spc = strchr(s1, ' ');
if (spc != NULL) *spc = '\0';
printf("%s\n",s1);
return 0;
}
'puts(strncpy(s2,s1,10));'將在此處起作用。 –
段錯誤是由於's1'指向一個字符串,它被分配在只讀存儲段中。嘗試寫入此段導致內存訪問衝突。這就是說,你可以爲你的目的使用'strtok'(再次,只要你的字符串被分配在一個可寫的內存段中)。 –
@naltipar:我不是低調的選民,但我會在那裏擺脫那個'50'。另外,反對票的一個很好的理由可能是你已經顯示了一個非常「硬編碼」的例子,說明如何在索引「10」處截斷該字符串。 –