我有一个字符串,末尾有一些空格。我希望在第一个空格出现时将该字符串终止,这样当我稍后对其进行strncpy()
时,它将仅复制不包含空格的字符串部分。
这是一些尝试,显然给了我一个细分。我该怎样做我打算做的事?
int main() {
char* s1 = "SomeString ";
*(s1 + 10)='\0';
printf("%s\n",s1);
return 0;
}
答案 0 :(得分:5)
像在*(s1 + 10)='\0';
中一样修改文字字符串的内容是未定义的行为。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
你可以使用
char s1[] = "SomeString ";
而不是
char* s1 = "SomeString ";
答案 3 :(得分: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;
}
答案 4 :(得分:-1)
也许strstr在您的案例中有用(http://www.cplusplus.com/reference/cstring/strstr/)
char * pFirstSpace = strstr (s1," ");
if (pFirstSpace) *pFirstSpace=0;
更新
正如许多其他人所注意到的那样,这种情况在访问冲突中出现了。这仅在动态分配的字符上运行。因此,您需要在更改其内容
之前将字符串复制到动态缓冲区中