2014-03-29 4 views
0

Я пытаюсь понять, как передать строку в качестве параметра, а затем вернуть другую строку в C. Я практикую, просто добавляя тест. Это для проекта, в котором я застрял, где мне нужно сделать некоторую проверку на строку и захотеть сделать это в отдельной функции. Очевидно, что мой пример более сложный, чем должен быть, но мне нужно знать, как манипулировать строкой, которая была передана как параметр, а затем вернуть ее как другую строку.Как передать строку в качестве параметра, а затем вернуть строку в C

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

void stringCopy(char *); 

int main() 
{ 
    char delay; 
    char string[10]; 
    printf("Enter the string: "); 
    scanf("%s", string); 


    char newString[20]; 

    strcat(newString, stringCopy(string)); 
    printf("String: %s", newString); 

    delay = getchar(); 
    delay = getchar(); 
    } 

/*char stringCopy(char *str) 
{ 
    char string2[20] = "test"; 

    strcat(string2, str); 

    return string2; 

}*/ 

char* stringCopy(char *str) 
{ 
    char *string2 = malloc(sizeof(char)*20); 

    strcpy(string2,"test"); 
    strcat(string2, str); 

    return string2; 

} 

Вот мой код для моей небольшой учебной программы заблаговременно за любую помощь.

** отредактирован, чтобы показать изменения. Я просто не знаю, как получить доступ к новому новому (string2) в main().

edit2: Я просто не могу получить его. Тем не менее, я очень благодарен всем. Действительно расстраивает. Я буду продолжать попытки, но я даже не понимаю, почему я получаю ошибки или как получить доступ к моей новой строке в main().

edit3: im идиот, у меня было расширение файла как .cpp, а не как .c.

+0

В чем проблема? Получаете ли вы неправильные результаты? – Benesh

+0

Я не знаю, как получить доступ к новой строке (string2) в main() – user2976759

+0

Просто сохраните функцию return в переменной 'char *'. Затем используйте его, как и любую другую строку. Не забудьте 'free()' it. – Deduplicator

ответ

0

Вам нужно вернуть строку, а не символ. Попробуйте это:

char* stringCopy(char *str) 
{ 
    char *string2 = malloc(sizeof(char)*20); 

    strcpy(strin2,"test"); 
    strcat(string2, str); 

    return string2; 

} 
+1

Также посмотрите, что Рикаян пошел на динамическое распределение. Байт на основе стека будет потерян при возврате функции ... Хотя это означает, что вы должны освободить его в своей основной программе. – Deduplicator

+0

Да, его код решил одну из моих проблем. Это доступ к нему в главном, где моя следующая трудность.Я должен был сделать это ясно в исходном коде – user2976759

1

Ваша проблема в том, что stringCopy()string2 живет только внутри функции. Как только окончательный } достигнут, объект перестает существовать и любая ссылка на него из других функций ошибочна.

Вам нужно либо передать указатель на результат (1), либо вернуть указатель на какой-либо объект, который будет продолжать жить после завершения функции (2).

/* 1 UNTESTED */ 
void stringCopy(char *destin, size_t dlen, const char *source) { 
    int n = snprintf(destin, dlen, "test%s", source); 
    if (n >= dlen) /* error */; 
} 
int main(void) { 
    char test[100]; 
    stringCopy(test, sizeof test, "foobar"); 
    printf("%s\n", test); 
} 

/* 2 UNTESTED */ 
char *stringCopy(const char *source) { 
    int size; 
    char *tmp; 
    size = strlen(source) + 5; 
    tmp = malloc(size); 
    if (tmp) { 
     int n = snprintf(tmp, size, "test%s", source); 
     if (n != size - 1) /* error */; 
    } 
    return tmp; 
} 
int main(void) { 
    char *test; 
    test = stringCopy("foobar"); 
    printf("%s\n", test); 
    free(test); 
} 
0

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

Выделяя новую строку в куче

char *stringCopy(char* src) { 
    char* dst = malloc(strlen(src) + 4 + 1); 
    strcpy(dst, "test"); 
    strcat(dst, src); 
    return dst; 
} 

int main() { 
    char string[10]; 
    printf("Enter the string: "); 
    scanf("%s", string); 
    char* newString = stringCopy(string); 
    printf("String: %s", newString); 
    free(newString); // important! 
} 

Passing в буфере в качестве параметра

void stringCopy(char* src, char* dst) { 
    strcpy(dst, "test"); 
    strcat(dst, src); 
} 

int main() { 
    char string[10]; 
    printf("Enter the string: "); 
    scanf("%s", string); 
    char newString[20]; 
    stringCopy(string, newString); 
    printf("String: %s", newString); 
} 

Обычно при прохождении буфера, вы бы также передать размер буфера так что функция может терпеть неудачу изящно, а не переполнять буфер.

+0

Не могли бы вы объяснить 'char * dst = malloc (strlen (src) + 4 + 1);' для меня, потому что он говорит «неверное преобразование из 'void *' на символ "char *". Благодаря! – user2976759

+0

@ user2976759 - Вероятно, вам нужен актерский состав. – Ferruccio

+0

* «error» * 'неверное преобразование из 'void *' в 'char *'' не является ошибкой в ​​C. Вам нужно использовать компилятор C для кода C. – pmg

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