2015-04-26 3 views
0

У меня есть строка с некоторыми пробелами на конце. Я хотел бы завершить эту строку в позиции, когда происходит первое пространство, так что, когда я позже сделаю strncpy(), он будет копировать только часть строки, которая не содержит пробелов.Null-завершение строки в C

Это какая-то попытка, которая дает мне segault. Как я могу делать то, что я намерен делать?

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

    return 0; 
} 
+0

'puts (strncpy (s2, s1,10));' будет служить цели здесь. –

+3

Segfault объясняется тем, что '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 указывает прямо на литеральную строку. Ниже строки literal используется для инициализации массива s1.

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

     return 0; 
    }