0

我有一个字符串,最后有一些空格。我想在第一个空格出现的位置终止这个字符串,这样当我以后做strncpy()它时,它只会复制不包含空格的字符串部分。

这是一些尝试,显然给了我一个 segault。我怎样才能做我打算做的事?

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

    return 0;
}
4

5 回答 5

5

像你一样修改文字字符串的内容*(s1 + 10)='\0';是未定义的行为。

于 2015-04-26T11:12:19.487 回答
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;
}
于 2015-04-26T11:17:14.853 回答
1

你可以使用

char s1[] = "SomeString             "; 

代替

char* s1 = "SomeString             ";
于 2015-04-26T11:55:35.393 回答
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;
    }
于 2015-04-26T13:20:35.923 回答
-1

也许 strstr 在您的情况下可能有用(http://www.cplusplus.com/reference/cstring/strstr/

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

更新

正如许多其他人所注意到的,这在访问冲突中得到了证实。这仅在动态分配的字符上运行。因此,您需要在更改其内容之前将字符串复制到动态缓冲区中

于 2015-04-26T11:11:25.680 回答