Member 13922884 Ответов: 2

Как осуществляется доступ к значениям при передаче строки массива в функцию с помощью указателя?


#include<stdio.h>
#include<string.h>
void frequency_ptr(char *str);
int main()
{
    char strings[30];
    printf("Enter a string:");
    gets(strings);
    frequency_ptr(&strings[0]);
}
void frequency_ptr(char *strings)
{
    int i=0;
    static int cnt[26];
    while(*strings[i]!='\0')
    {
    if(*strings[i]>='a' && *strings[i]<='z')
    cnt[*strings[i]-'a']++;   
    i++;
    }
    for(i=0;i<26;i++)
        printf("\n%c occurs %d times:", 'a'+i, cnt[i]);
}


Что я уже пробовал:

Нижеприведенная программа прекрасно работает для меня. Но почему я получаю ошибку в приведенном выше цикле while?
while(strings[i]!='\0')
 {
    if(strings[i]>='a' && strings[i]<='z')
    cnt[strings[i]-'a']++;
    i++;
 }


Заранее спасибо.

Patrice T

- Но почему я получаю ошибку в вышеупомянутом цикле while?
Какое сообщение об ошибке ? и куда же ?

2 Ответов

Рейтинг:
7

CPallini

Никогда не используйте gets, использовать fgets вместо. Попробуй:

#include<stdio.h>
void frequency_ptr(const char *str);

#define SIZE 30
#define LETTERS 26

int main()
{
  char string[SIZE];
  printf("Enter a string:");
  fgets(string, sizeof(string), stdin);
  frequency_ptr(string);
  return 0;
}

void frequency_ptr(const char * str)
{
  unsigned int cnt[LETTERS]={0};
  while(*str != '\0')
  {
    if(*str>='a' && *str<='z')
      cnt[*str-'a']++;
    ++str;
  }
  size_t i;
  for(i=0; i<LETTERS;i++)
    printf("%c occurs %d times.\n", (char)('a'+i), cnt[i]);
}


Member 13922884

Спасибо!!

CPallini

Добро пожаловать.

KarstenK

Убрав меня вы изменили код больше, чем необходимо. (Плохо для сравнений) И мне не нравится менять входные параметры. Это всегда сбивает с толку. ;-)

CPallini

Это обычная идиома с C-строками.
То, что нравится вам (и мне), не имеет большого значения. :-)

Рейтинг:
19

Jochen Arndt

Код в разделе "Что я пробовал" верен.

Это обычная проблема для начинающих C/C++, чтобы понять отношение указателей и массивов.

Но он покрыт любыми книгами и учебниками по C/C++ (ищите в интернете что-то вроде "array vs pointer").

См., например, раздел "указатели и массивы" на сайте . Класс C - массивы, строковые константы и указатели[^].

В вашем случае у вас есть параметр функции char *strings. Те средства strings является указателем на char ценности. Используя Оператор разыменования - Википедия[^], вы получите доступ к первому символу строки:

char first_char = *strings;
Это также можно сделать с помощью доступа к массиву [] оператор:
char first_char = strings[0];

Так что использование
char c = *strings[0];
это то же самое, что
char c = **strings;
и то и другое приводит к ошибке компиляции, потому что вышеизложенное будет действительным только тогда, когда strings иметь тип char ** (указатель на указатель на char).


Member 13922884

Спасибо!!

Jochen Arndt

Добро пожаловать и благодарю вас за то, что вы приняли мое решение.