Ошибка при установке символа в строку в C - PullRequest
2 голосов
/ 18 декабря 2010

Эй, ребята, мне нужна ваша помощь.Я пытаюсь извлечь символ из строки и установить его как 2-й элемент массива строк.Тем не менее, как обычно C дает мне ошибки сегментации, я пробовал sprintf, strcpy и все еще ошибки сегментации, код:

int getwords(char *line, char *words[])
{    
    int nwords=2;  
    char *result= NULL;
    char TABS[]="\t";
    char spaces[]=" ";
    char commas[]=","; 
    result = strtok(line,TABS);
    words[1]=result[strlen(result)-1];//setting the 2nd element of the array to a char
    result[strlen(result)-1]='\0';//removing the extracted char from the string
    words[0]=result;//setting 1st element to the new modified word
    printf("the opcode is:%s and the type is:%c\n",words[0],result[strlen(result)-1]);

    return nwords;

}

например, если я даю это "пока"он должен вернуть 2 и массив, содержащий 2 элемента: 1st elem = "bye" 2nd elem = "."Я выполнил несколько тестов и обнаружил, что ошибка в утверждении: words [1] = result [strlen (result) -1];Любая помощь приветствуется

Ответы [ 2 ]

5 голосов
/ 18 декабря 2010

Вы уверены, что words является изменяемой строкой?

Литеральные строки являются неизменяемыми строками. Например: это дает ошибку сегментации:

char *test = "forty two";
test[6] = 'T'; /* make two uppercase */

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

2 голосов
/ 18 декабря 2010

В приведенном ниже коде есть две, может быть, четыре ошибки, я объясняю две ошибки в комментариях к коду:

If we assume that "line", for the purposes of explaining what happens, is "hey\tthere"...
We also assume that "words" is an array of two pointers to char.

// Find the first token, in this case "hey", and return it in "result".
result = strtok(line,TABS); // NOTE: 'line' has been modified by the function!

// Take the last character in the returned statement, which is 'y', and
// copy it to the second cell in the 'words' array, however we are supposed
// to be copying a *pointer* to char there...
words[1]=result[strlen(result)-1];

Кроме того, если «строка» является статической и не может быть изменена, первая строка выше потерпит крах. Если «words» не выделен или не ссылается на массив из по крайней мере двух указателей на char, то вторая строка завершится сбоем.

Если выполнение кода достигнет этой точки, любой код, использующий массив "words", потерпит крах, потому что код будет ожидать указатели, но получает символы!

...