2016-05-30 3 views
-5

Почему этот код не работает?Удалить последний символ строки

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

int main(void) 
{ 
// local declarations 
int len; 
char* pStr; 

// statements 
printf(" how many characters you want to enter?\n"); 
scanf("%d", &len); 
pStr=(char*)calloc(len+1,sizeof(char)); 
printf("\n enter your string: "); 
gets(pStr); 
*(pStr+len)='\0'; 
printf("\n your string: "); 
puts(pStr); 
printf(" oops! last character deleted."); 

getch(); 
return 0; 
} 

хотя он работает правильно, когда я использую Scanf функцию, чтобы прочитать строку, но , почему он не с получает?

+0

* (pStr + len) -> * (pStr + len * sizeof (char)) – Gar

+0

Не смешивайте использование scanf с get. [проверить этот ответ SO] (http://stackoverflow.com/questions/22226529/program-doesnt-execute-gets-after-scanf-even-using-fflushstdin) –

+6

Задавать пользователю, как долго будет вводиться ввод, является сомнительным стремиться. * Доверяя, что вход пользователя в соответствие является глупым. @ K.Gkinis: Не используйте 'gets()', period. Он удален из С по уважительной причине. – EOF

ответ

3

scanf("%s", pStr) пропускает первый символ без пробелов, а gets - нет.

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

Отметьте, что gets отмечен как устаревшее из-за серьезных недостатков безопасности. Рекомендуется, чтобы любое использование gets(var) было заменено на fgets(var, length, stdin).

1

Поскольку массивы основаны на нулевом значении и (при условии, что вход действителен и правильная длина, предположение, которое ваш код не должен делать) *(ptr + len) уже содержит \0, и вы просто перезаписываете его. Вы хотели перезаписать ptr[len-1]

+0

Для большой забавы, как пользователь, введите '0' для длины. – EOF

+0

"массивы основаны на нулевом значении" ??? Как это? – Olaf

+1

Первый элемент массива индексируется на 0. Если массив A содержит строку «foo», то «A [0] == 'f'',' A [1] ==' o'', ​​'A [2] == 'o'' и 'A [3] ==' \ 0''. Обратите внимание, что 'A [len (" foo ")] == '\ 0'', поэтому он не меняет строку, чтобы перезаписать ее. –

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