2017-02-12 22 views
0

Я пытаюсь сделать простой код, который преобразует один тип данных в другой. Я использую strtok для извлечения одной части данных, а затем я запускаю длинный серийный номер if условий, чтобы найти правильный выход. Однако, когда правильный вывод найден и записан в переменной currentNote, он также, кажется, перезаписывает переменную comma по той причине, которую я не могу понять. Здесь не является проблематичной частью кода:Как предотвратить strcpy от перезаписи другой переменной?

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

int main() 
{ 
    char sequence[] = "c1[M],c1[M],d3[L],c3[M],b2[M],(#A-2)[IKN],(#A-1)[L]"; 
    char copy[] = ""; 
    char *comma; 
    char currentNote[4] = ""; 

    strcpy(copy, sequence); 

    comma = strtok(copy, ","); 

    if(strstr(comma, "c1") != 0)  //c1 
     { 
       printf("%s\n\n", comma);   //Here ... 
       strcpy(currentNote, "C5 "); 
       printf("%s\n\n", comma); 
     } 
    return 0; 
} 

И вот результат:

c1[M] 

cC5 

Нет необходимости говорить о том, что strcpy(currentNote, "C5 "); вызывает его. Я не знаю, почему, хотя, я думал, что он вернет c1[M], как я бы хотел. После нескольких экспериментов выясняется, что второй printf("%s\n\n", comma); всегда будет возвращать первый символ sequence, за которым следует C5. Надеюсь, кто-то узнает, это было бы очень здорово.

+0

Возможно, дайте 'copy' некоторую память для хранения вещей в –

+0

Это не компилируется. Где объявляется 'currentNote'? – ikegami

+1

'strcpy (копия, последовательность)' не годится. 'copy' не хватает места. – ikegami

ответ

1

Вы звоните
strcpy(copy, sequence) в то время как copy - это массив длиной в 1 элемент. Вы должны определить его, придав ему достаточный размер. Ваш код как есть, это просто UB. Пересмотрите это как

char copy[100];

Или выделить достаточно памяти для него динамически с помощью malloc.

+1

спасибо @chux. Всегда оценивайте свои отзывы. Просто отредактировал ответ. – VHS

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

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