2015-12-11 2 views
0

Его простой ввод, который я хочу сделать для char *. Почему это не работает? Он бросает мне исключение, которое я не могу решить ..Как ввести char * в C?

#include "stdafx.h" 
#include "stdio.h" 
#include "stdlib.h" 

char* GetCharSeq() 
{ 
    char *s = (char*)malloc(100); 

    scanf_s("%s", s); 

    return s; 
} 

int main() 
{ 
    char* charseq; 

    charseq = GetCharSeq(); 

    return 0; 
} 
+3

Не относится к вашей проблеме, но для файлов системных заголовков вы должны использовать угловые скобки, например, '#include ', а в C вы [не должны бросать результат 'malloc'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –

+1

, если вы получаете исключение, имеет смысл опубликовать его так же, как и – hoijui

+0

. Вы всегда должны проверять коды возврата (например, 'scanf_s'). Каково фактическое исключение? – CristiFati

ответ

1

изменить код

char* GetCharSeq() 
{ 
    char *s = (char*)malloc(100); 

    gets(s); 

    return s; 
} 

Это будет работать.

+0

Он будет работать, если вы введете не более 99 символов, но по этой причине небезопасно! –

+0

Ну, мы можем изменить значение аргумента 'malloc()' на любое число, которое мы хотим. Не будет ли это делать? –

4

Вы неопределенное поведение в вашем коде. У вас есть это, потому что вы предоставляете несколько аргументов функции scanf_s.

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

scanf_s("%s", s, 100); 
+1

Как это компилировать/ссылаться на список несогласованных параметров? –

+4

@MartinJames по той же причине 'printf ("% s ");' будет компилировать и связывать. – mch

+0

@MartinJames Поскольку '...' в прототипе означает переменное количество аргументов, а компилятор не имеет возможности узнать точную сумму. Некоторые компиляторы могут понять это, проанализировав строку формата и выдаст предупреждения для таких проблем, но это всего лишь предупреждение и технически законный C. –

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