2016-04-14 13 views
-1

Я только начал учиться c. я делаю упражнение, и вопрос заключается в следующем.Вставка подстроки в другую строку в c

Напишите функцию с именем insertString, чтобы вставить одну строку символов в другую строку. Аргументы функции должны состоять из исходной строки, строки для вставки и положения в исходной строке, где должна быть вставлена ​​строка , Таким образом, вызов insertString (text, "per", 10); с текстом, как первоначально определено "the wrong son", приводит к тому, что строка символов "per" вставляется внутри текста, начиная с text[10]. Поэтому строка символов "the wrong person" хранится внутри текстового массива после возврата функции.

#include<stdio.h> 
int insertString(char[],char[],int); 
int stringLength(char[]); 
int main() 
{ 
    char text[]="the wrong son"; 
    int result=insertString(text,"per",10); 
    if(result!=-1) 
    printf("string 1 is : %s \n",text); 
    else 
    printf("Not possible\n"); 
    return 0; 
} 
int insertString(char a[],char b[],int pos) 
{ 
    int i=0,j=0; 
    int lengthA=stringLength(a); 
    int lengthB=stringLength(b); 
    if(pos>lengthA) 
    return -1; 

    for(i=lengthA;i>=pos;i--) 
     a[i+lengthB]=a[i]; 

    for (i = 0; i < lengthB; ++i) 
     a[i + pos] = b[i]; 

    return 1; 
} 
int stringLength(char x[]) 
{ 
    int length=0; 
    while(x[length]!='\0') 
    length++; 
    return length; 
} 

Я сделал это, и он тоже работает. но я получаю сообщение abort trap : 6. когда я смотрел на него, я узнал, что это ошибка, потому что я пишу в память, которой я не владею. так как я использовал массивы символов переменной длины, где бы ни находился null character, указывает конец массива, и я пытаюсь расширить его, вставив строку, это мое понимание. До сих пор я прав?

Я также перемещаю null character. я не знаю, правильно это или нет.

так есть способ обойти эту ошибку? Кроме того, я еще не знаю указателей, и они находятся в следующей главе учебника.

Любая помощь в этом была бы очень признательна.

+1

Вы не используете «массивы символов переменной длины». Вы либо должны заранее выделить достаточно места для вашего конечного результата, либо вам нужно использовать выделенную память и, возможно, перераспределить ее. Посмотрите ссылки на 'malloc()' и 'realloc()'; – Logicrat

+0

«Я использовал массивы символов переменной длины» где? 'char a []' в заголовке функции не является массивом переменной длины. –

+0

о, не так ли? @Logicrat. в учебнике указано, что массивы символов, которые заканчиваются символом «нуль», представляют собой массивы символов переменной длины – yash

ответ

1

Массив переменной длины - это very specific C construct, который не имеет ничего общего с тем, что ваш учебник называет массивами переменной длины. Если бы я был вами, я бы не стал доверять этому учебнику, если бы сказал, что 1 + 1 = 2. Так много для этого.

Символьный массив, который заканчивается нулевым символом, называется строка почти всем, везде.

char text[]="the wrong son"; 

Ваш учебник привел вас верить, что text будет держать столько символов, сколько вам нужно. Увы, в C. нет такой вещи. На самом деле text будет содержать ровно столько символов, сколько есть в его инициализаторе, плюс 1 для нулевого терминатора, поэтому вы не можете вставлять что-либо в него.

Для того, чтобы ваша программа работала, вам необходимо явно выделить столько символов для text, что и итоговая строка, которая будет содержать .

Так как есть 14 символов в «неверном сына» (в том числе терминатора) и три символа в «за» (не считая терминатора), вам нужно 17 символов в общей сложности:

char text[17]="the wrong son"; 

You также можете проверить ваши расчеты:

int result=insertString(text, "per", 10, sizeof(text)); 
... 
int insertString(char a[], char b[], int pos, int capacity) 
{ 
    ... 
    if (lengthA + lengthB + 1 < capacity) 
    return -1; 
    ... 
+0

большое спасибо @ n.m. до сих пор я ошибаюсь. теперь это очистило меня. – yash

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

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