Передача строки через функцию (программирование на C) - PullRequest
3 голосов
/ 17 декабря 2011

Я только начал изучать указатели, и после большого добавления и удаления * s мой код для преобразования введенной строки в верхний регистр наконец работает ..

#include <stdio.h>
char* upper(char *word);
int main()
{
    char word[100];
    printf("Enter a string: ");
    gets(word);
    printf("\nThe uppercase equivalent is: %s\n",upper(word));
    return 0;
}

char* upper(char *word)
{
    int i;
    for (i=0;i<strlen(word);i++) word[i]=(word[i]>96&&word[i]<123)?word[i]-32:word[i];
    return word;
}

У меня вопрос, при вызове функции, которую я послал word, которая сама является указателем, поэтому в char* upper(char *word) зачем мне использовать *word? Это указатель на указатель? Кроме того, char* существует, потому что он возвращает указатель на символ / строку, верно? Пожалуйста, объясните мне, как это работает.

Ответы [ 3 ]

4 голосов
/ 17 декабря 2011

Это потому, что тип , который вам здесь нужен, это просто «указатель на символ», который обозначается как char *, звездочка (*) является частью спецификации типа параметра.Это не «указатель на указатель на символ», который будет записан как char **

Некоторые дополнительные замечания:

  1. Кажется, вы путаете оператор разыменования * (используется для доступа к месту, на которое указывает указатель) со звездочкой в ​​качестве указателя в указании типа;вы нигде не используете оператор разыменования в своем коде;Вы используете звездочку только как часть спецификации типа!Посмотрите эти примеры: чтобы объявить переменную как указатель на символ, вы должны написать:

    char * a;
    

    Чтобы присвоить значение пространству, на которое указывает a (используя оператор разыменования), вынаписал бы:

    *a = 'c';
    
  2. Массив (из char) не совсем равен указателю (на char) (см. также вопрос здесь ).Однако в большинстве случаев массив (char) может быть преобразован в указатель (char).

  3. Ваша функция фактически изменяет внешний массив char ( и передает обратно указатель на него);printf будет печатать не только верхний регистр введенного значения, но и переменную word функции main, которая будет содержать верхний регистр введенного слова.Будьте осторожны, такой побочный эффект на самом деле то, что вы хотите.Если вы не хотите, чтобы функция могла изменять внешнюю переменную, вы можете написать char* upper(char const *word) - но тогда вам также придется изменить определение вашей функции, чтобы она не изменяла word напрямую.переменная, в противном случае компилятор будет жаловаться.

2 голосов
/ 17 декабря 2011

char upper(char c) будет функцией, которая принимает символ и возвращает символ.Если вы хотите работать со строками, соглашение состоит в том, что строки - это последовательность символов, оканчивающаяся нулевым символом.Вы не можете передать всю строку функции, поэтому передаете указатель на первый символ, поэтому char *upper(char *s).Указатель на указатель будет иметь два *, как в char **pp:

char *str = "my string";
char **ptr_to_ptr = &str;
char c = **ptr_ptr_ptr; // same as *str, same as str[0], 'm'

верхний также может быть реализован как void upper(char *str), но более удобно, чтобы верхний возвращал переданную строку.Вы использовали это в своем примере, когда вы printf строка, которая возвращается в верхнем.

Так же, как комментарий, вы можете оптимизировать свою верхнюю функцию.Вы звоните strlen за каждый i.Строки C всегда заканчиваются нулем, поэтому вы можете заменить i < strlen(word) на word[i] != '\0' (или word[i] != 0).Также код лучше читать, если вы не сравниваете 96 и 123 и вычитаете 32, но если вы сравниваете и вычисляете с 'a', 'z', 'A', 'Z' или любым другим символом, который вы имеете в виду.

0 голосов
/ 20 декабря 2014

* слова - это даже если указатель на слово массива в функции и слово указателя фактически указывают на одно и то же при передаче аргументов jst копию "pointee", то есть введенное слово и все операция выполнена, сделана над словом указателя, поэтому в конце мы должны вернуть указатель, чтобы тип возвращаемого значения был указан как *.

...