Нахождение длины строки с помощью указателей - PullRequest
0 голосов
/ 28 февраля 2019
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char *str=malloc(sizeof(char)*100);
    int length=0;
    printf("Enter string :\n");
    scanf("%c",str);
    while(*str)
    {
        length++;
        *str++;
    }
    printf("%d",length);
    return 0;
}

Я пытаюсь написать программу для определения длины строки с помощью указателей. Но независимо от строки, я получаю результат как 1. Может кто-нибудь сказать мне, что не так?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Проблема в том, что вы сканируете.

char *str=(char*)malloc(sizeof(char)*100);

printf("Enter string :\n");
scanf("%s",str);
int i = 0;
for (i = 0; i < 100 && str[i] != '\0'; i ++)
{
}
printf("%d",i);
0 голосов
/ 28 февраля 2019

Вы выделяете 100 байтов, хорошо

char *str=malloc(sizeof(char)*100);

int length=0;
printf("Enter string :\n");

У вас есть строка, но вы читаете один символ

scanf("%c",str);

Пока этот символ равен! = 0 Вы увеличиваете символ на один, например 'A'становится' B 'и т. д. символ переполняется

while(*str)
{
    length++;
    *str++;

Вместо этого читайте строку, используя fgets ()

const int maxlen = 100;
char *str=malloc(maxlen); 

if (fgets(str,maxlen,stdin) != NULL)
{
  // now to calculate the length
  int length = 0;
  char* p = str;  // use a temp ptr so you can free str 
  while (*p++) 
  { 
    ++length; 
  }
  printf("length=%d", length);
  free(str); // to avoid memory leak
}
0 голосов
/ 28 февраля 2019

Модификатор %c в scanf читает последовательности символов.Поскольку вы не указали ширину поля, по умолчанию она считывает только один символ.Возможно, вы захотите использовать модификатор %s.

Кроме того, если модификатор длины не добавлен, возвращаемая последовательность символов не завершается нулем, что делает ваш цикл для определения длины рискованным (вы также можете захотетьиспользуйте функцию strlen из стандартной библиотеки C, но эта функция также ожидает последовательность с нулевым символом в конце).

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