2015-08-16 2 views
-1

Я знаю, что строковые литералы хранятся в постоянной памяти, поэтому вы не можете их обновить. Но что случилось с strlen() function.it работает, если я инициализирую char * s внутри программы.ошибка сегментации (сбрасывается ядром) при взятии строки от пользователя и поиске ее длины с помощью strlen()

т.е.
char *s="hey"; 
length=strlen(s); 
printf("%d\n",length);// this works 

и не принимая строку из пользователя

char *s; 
int length; 
scanf("%s",s); 
length=strlen(s); 
printf("%d\n",length); //this doesn't. gives segmentation fault 
+1

'зсапЕ («% S», с);' вызывает неопределенное поведение, а это значит, что все может случиться. –

ответ

5

Вы должны выделить память, где вы собираетесь прочитать строку. Для exampe

char s[20] = { '\0' }; 
int length; 
scanf("%19s",s); 
length=strlen(s); 
printf("%d\n",length); 

Если вы объявили S, как этот

char *s; 

тогда указатель не инициализирован.

Если вы объявили S как этот

char *s="hey"; 

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

+0

спасибо за ответ :) Что делать, если у меня мало тестовых случаев. Один с пользовательским вводом 1000+ символов и другими с 5 символами. Если я использую массив символов, он тратит много пространства. Любая альтернатива (только в c)? – Satyanarayin

+0

@Satyanarayin Динамическое распределение памяти с 'malloc' и' realloc' - это то, что вы ищете. –

-2

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

Я надеюсь, что вы получили то, что вы ищете

+0

спасибо за ответ :) Что делать, если у меня мало тестовых случаев. Один с пользовательским вводом 1000+ символов и другими с 5 символами. Если я использую массив символов, он тратит много пространства. Любая альтернатива (только в c)? – Satyanarayin

+0

@Gaurav: Неправильно, если вы не выполняете 'nul', то поведение' strlen' не определено. –

+0

@Satyanarayin: В C++ есть другие языковые параметры, но в C вы, скорее всего, будете искать функцию, которая принимает входной символ по символу и строит массив. С помощью вашей собственной функции вы можете отслеживать длину и изменять размер массива, выделяемого 'malloc', используя' realloc', если это необходимо. Есть несколько не-переносных расширений для 'scanf', которые позволяют ему выделять нужную ему память, но это только если вы используете gcc как компилятор (я не рекомендую нестандартную функциональность). –

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