Проблема с указателем C! - PullRequest
1 голос
/ 12 апреля 2011

Почему следующий код C не вывод 10

#include<stdio.h>
#include<stdlib.h>
void get_length(char s[]);
int main( ) 
{
char buff[128];
printf("\nEnter buffer data: ");
scanf("%s",buff);
get_length(buff);
}

void get_length(char *s){
    int count;  
for(count = 0 ; *s != '\0' ; s++)
    count++;
printf("count = %d\n",count);
}

Вход Я Рохит
Выход равен
count = 432
Может кто-нибудь объяснить, пожалуйста.

Ответы [ 4 ]

5 голосов
/ 12 апреля 2011

Похоже, у вас есть 5 вместо % в строке формата scanf.(Возможно, клавиша Shift нуждается в очистке.)

Это означает, что scanf фактически ничего не читает в ваш буфер.Ваш код не проверяет возвращаемое значение из scanf (оно должно быть!) И поэтому никогда не замечает, что это не удалось.Итак, вы пытаетесь вычислить длину ... буфера, заполненного неинициализированным мусором.Это может дать вам 432, или 0, или что-нибудь еще вообще.

[ИЗМЕНЕНО, чтобы добавить:] ... Ох.И даже если вы это исправите, он все равно не будет работать, потому что scanf прекратит чтение, когда увидит символ пробела , включая символ новой строки, и поэтому функция \n your get_length ищетfor не будет в буфере.

Кстати, знаете ли вы о функции strlen в стандартной библиотеке C?

3 голосов
/ 12 апреля 2011

Я думаю, что вы имели в виду %s, а не 5s.

Кстати, инициализация значения вашего массива (char buff[128] = {}) предотвратит неограниченность вашего массива (count = 432 для вас произвольно).

Затем следует проверить *s != '\0', а не \n в get_length - строки в стиле C ограничены символом NULL (\0), а не символами новой строки, независимо от того, что вы взялиданные из пользовательского ввода.Новая строка теряется из этого ввода.

1 голос
/ 12 апреля 2011

Я думаю, что scanf читает вашу строку и устанавливает последний символ в '\ 0', но вы ищете '\ n', что, я не думаю, подразумевается в реализации scanf.

То есть проверьте '\ 0' вместо '\ n'.

1 голос
/ 12 апреля 2011

Ошибка вызова scanf, так как вы использовали неверный формат.Если вам нужна строка длиной 5, тогда формат должен быть "%5s" вместо "5s" или просто "%s", если пятерка является полной опечаткой.Итак, буфер символов неинициализирован, и вы получаете количество байтов до того, как в стеке встретится первый случайный символ '\n'.Также scanf игнорирует символы новой строки.Таким образом, ваша get_length функция никогда не будет работать должным образом.

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