2016-12-06 6 views
1

Я изо всех сил, чтобы найти I способ получить следующую строку с помощью функции string.h MemSet (...), тетсру (...) и strcat (...):Можно ли каким-либо образом скопировать значения в определенную строку с помощью memcpy()?

00000abcd

Я должен использовать memcpy, и я не могу найти способ сделать это, не возвращаясь к началу строки.

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

void main() { 
    char string [15]; 

    memset((void *)string,'0',6*sizeof(char)); 
    memcpy(string,"1234",4); 
    strcat(string,"abcd"); 

    printf("String: %s\n",string); 
} 

output-> String 123400abcd

Если кто-то приходит с идеей, я оценил бы его так много.

+0

Возможно ли, что вы хотите написать 'MemSet ((недействительными *) строки, '\ 0' , 6 * sizeof (char)); 'вместо ...' 'o'' ...? То есть вы хотите написать байты со значением 0, чтобы было гарантированное прерывание строки, а не байты со значением 48 (значение ASCII «0»). (Теперь я вижу, вероятно, нет, или вы должны были установить все 15 байт.) –

ответ

3

У вас есть два основных вопроса:

  • забудьте указать смещение на использовании memcpy
  • не имеющая строку нуля при применении strcat

Попробуйте это:

char string [15] = {0}; 

memset(string,'0',6); 
memcpy(string + 6,"1234",4); 
strcat(string,"abcd"); 

printf("String: %s\n",string); 

Выход: 00000abcd

1

Поведение вашего кода: undefined.

Вы можете исправить это, написав char string [15] = {'\0'};. Это приведет к инициализации всех памяти строки до нуля (первый символ установлен явно \0, последующие символы по умолчанию инициализируются нулем).

В настоящее время происходит то, что strcat проходит мимо string, пока не найдет нуль-терминатор, прежде чем он объединит "abcd". Этот процесс в настоящее время испуская два дополнительных символов из-за вашей memset и немного непредсказуемое поведение, что я уже говорил в вашем предположении, что string инициализируется в 0, когда вы пишете char string [15];

3

Pedantic версия:

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

int main (void) 
{ 
    char string [15]; 
    const char substr1 [] = "1234"; 
    const char substr2 [] = "abcd"; 
    const size_t zeroes = 6; 

    memset(string, '0', zeroes); 
    memcpy(&string[zeroes], substr1, sizeof(substr1)); // includes null term 
    strcat(string, substr2); 

    printf("String: %s\n", string); 
    return 0; 
} 
+0

Какая версия является единственной до сих пор ;-) – Bathsheba

+0

В чем преимущество определения двух 'substr'? –

+1

@ PeterA.Schneider Позволяет использовать 'sizeof'. В качестве альтернативы вы можете написать 'memcpy (& string [zeroes]," 1234 ", sizeof (" 1234 ")) ;, но это дает повторение кода, поэтому оно более подвержено ошибкам и менее обслуживаемо. Но, конечно, этот пример немного глупо, учитывая искусственные требования. – Lundin

 Смежные вопросы

  • Нет связанных вопросов^_^