2012-01-05 3 views
1

Я отправляю это как вопрос для своих вопросов (у меня будет множество). Я решил, что было бы довольно досадно продолжать задавать одному человеку один вопрос за раз (сказал, что человек очень занят), поэтому я буду размещать вопросы, когда сталкиваюсь с ними в своем проекте. Если вам хочется помочь, пожалуйста, сделайте это, и я был бы очень признателен!Извлечение первой части строки

Примечание: это означает, что я буду обновлять это сообщение часто. Помощь очень, очень ценится, как всегда.

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

Мой первый вопрос:

я получаю ошибку:

lvalue required as left operand of assignment

ЦЕЛЬ этого кода, чтобы скопировать первый символ п до ':'. Например, если currentline: "LABEL: .long 100", то GetLabelName вернет "LABEL".

ПРИМЕЧАНИЕstrncpy не работает для этого. Он возвращает остальные символы после игнорируя первые п символов, а не просто возвращаются первые п символов ...

Вот код, который вызывает ошибку:

char *GetLabelName(char *currentline){ 
    char *labelname[200]; 
    while((((*labelname)++)=(*currentline)++)!=':'); 
    return labelname; 
} 

что-то подозрительное в этом коде я думаю, но я не могу понять, что. Есть идеи?

+6

Пожалуйста, не обновляйте это сообщение часто. На самом деле это не так. Пожалуйста, задайте отдельный вопрос для каждого отдельного вопроса.(И это не помешает сделать небольшую часть поиска в первую очередь, так как C существует некоторое время, и многие вопросы немного устарели на данный момент. :) – sarnold

+0

Пожалуйста, задавайте вопросы отдельно, не сидите здесь и отредактируйте одно сообщение, чтобы добавить несколько вопросов. –

+0

Что вы пытаетесь сделать в этом фрагменте кода в мире? Должно ли 'labelname' также быть' char (*) [] 'или' char [] '? Вы просто пытаетесь вернуть указатель на строку '': ''в строке? Вы смотрели на 'strchr' или' strtok'? – AusCBloke

ответ

4

Что я думаю, что вы пытаетесь сделать, это извлечь/скопировать все символы в строке до определенной точки (':' или NUL) и вернуть этот буфер. Если это так, вам потребуется динамически распределять память для новой строки (вы не можете вернуть локальный буфер, выделенный в стеке), и вы также должны воспользоваться функциями в <string.h>, например strchr и memcpy.

Вот альтернативный рабочий пример:

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

char *extract_string(char *str, char delim) 
{ 
    size_t len; 
    char *new_str; 
    char *delim_pos = strchr(str, delim); 

    /* new string is the length from the start of the old string to the 
    * delimiter, or if it doesn't exist, a copy of the whole string */ 
    if (delim_pos == NULL) 
     return strdup(str); 

    len = delim_pos - str; 
    new_str = malloc(len + 1); 
    memcpy(new_str, str, len); 
    new_str[len] = '\0'; /* NUL terminate the new string */ 

    return new_str; 
} 

int main(void) 
{ 
    char *extracted1 = extract_string("some:string", ':'); 
    char *extracted2 = extract_string("no delimiter", ':'); 

    puts(extracted1); 
    puts(extracted2); 

    /* free the dynamically allocated buffers */ 
    free(extracted1); 
    free(extracted2); 

    return 0; 
} 

Выход:

some 
no delimiter 

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

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

+0

Ты мужчина, спасибо – NONE

+0

+1 Я думаю, это именно то, что ожидает OP; также 'strtok' - лучший вариант. – dicaprio

0

Проблема есть (* название подписи) ++. Вы увеличиваете значение, на которое указывает имя метки, и одновременно присваиваете ему значение, на которое указывает текущая строка. Если вы хотите увеличить указатели, используйте * labelname ++ и * currentline ++

+0

Не работает, пробовал до – NONE

+0

Это сработало бы: 'char * GetLabelName (char * currentline) { char * labelname = malloc (sizeof (char) * 200); char * return = labelname; while ((* название метки ++ = * currentline ++)! = ':'); * - labelname = '\ 0'; возвращение возвращено; } ' – mwk

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