2010-12-07 2 views
0

У меня есть основная функция, как это:Как использовать символ * в C

void main() 
{ 
    char *s; 
    inputString(s); 
    printf("%s",s); 

} 

и inputString функция:

void inputString(char *&s) 
{ 

    //Some code line to input a string and set s point to this string 

} 

Есть ли у функции автоматического таНоса память достаточно хранить строку, которая занесена (I нужна входная строка в функции inputString).

+2

это C или C++? – 2010-12-07 15:35:57

+6

Что не так в использовании `std :: string` и` std :: cin`? – 2010-12-07 15:36:52

+5

это английский? – Simone 2010-12-07 15:37:08

ответ

1

Вы смесительный C и C++ в вашем примере.

В вашем случае, прежде чем вы сможете использовать s, он должен быть инициализирован. Например, как это:

void inputString(char *&s) 
{ 
    s = strdup(xxx); // or malloc, calloc, etc. 

} 

Но на самом деле, то лучше всего использовать обычный старый C:

char* inputString(void) 
{ 
    char* s = strdup(xxx); 
    return s; 
} 
4

Если вы продолжаете использовать этот подход в стиле C, то нет, вам придется делать предположения и выделять достаточно памяти самостоятельно. C++ подход гораздо выше, использовать STD :: строки и не делать вручную распределения:

#include <string> 
#include <iostream> 
void inputString(std::string& s) 
{ 

    //Don't bother for the memory management 

} 
int main() 
{ 
    std::string s; 
    inputString(s); 
    std::cout << s ; 
} 

Также стоит обратить внимание, что ваш код не является законным C++. void main() является незаконным !!!

Edit: Во время этого ответа на вопрос была помечена C++. Позже этот вопрос был retagged НЕ в ОП, и я не совсем согласен с этим ...

5

Только 3 строки кода (положить их в int main()) являются достаточно

std::string s; 
std::cin >> s; //or getline() as desired 
std::cout << s; 
1

Если предположить, что вы делаете это C, а не C++.

Существует два подхода: inputString должен выделить память, или вызывающий абонент inputString должен выделить память.

если inputString выделяет память ваша функция, вероятно, выглядеть так:

char* inputString(void) 
{ 
    int len = strlen (MyInternalString) + 1; 
    char* s = malloc (len); 
    strncpy(s, MyInternalString, len); 
    return s; 
} //similar to what Rustram illustrated 

Вы должны также включать в себя: недействительным freeString (символ * НТР) { бесплатно (НТР); } как есть. Это позволяет пользователю понять, что они необходимы для управления памятью самой возвращенной строки.

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

int inputString(char* str, int maxLen) // 
{ 
    if (maxLen >= myInternalStringLength + 1) 
    { 
    strncpy(str, myInternalString, maxLen) 

    } 
    return myInternalStringLength + 1; 
} 

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

Ваш главный теперь становится:

int main() 
{ 
    char *s = NULL; 
    int len = inputString(s, 0); 
    s = alloca(len); //allocates the memory on the stack 
    len = inputstring(s, len); 
    printf("%s",s); 
} //no need to free the memory because the memory alloca'ed gets 
    //freed at the end of the stack frame 
0
int main() 
{ 
    std::string s; 
    inputString(s); 
    printf("%s",s.c_str()); 
} 

и inputString функция:

void inputString(std::string& s) 
{ 
    //Some code line to input a string and set s point to this string 
    std::cin >> s; 
}