通过函数传递字符串(C编程)

时间:2011-12-17 13:42:57

标签: c string function pointers uppercase

我刚刚开始学习指针,经过多次添加和删除*之后,我将用于将输入的字符串转换为大写的代码最终起作用..

#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 个答案:

答案 0 :(得分:4)

那是因为你需要的类型只是“指向char的指针”,表示为char *,星号(*)是参数类型规范的一部分。它不是“指向char的指针”,它将被写为char **

其他一些评论:

  1. 您似乎混淆了取消引用运算符 *(用于访问指针指向的位置),星号作为类型指定中的指针符号;您没有在代码中的任何位置使用取消引用运算符;你只是使用星号作为类型规范的一部分!请参阅以下示例:要将变量声明为指向char的指针,您需要编写:

    char * a;
    

    要为a所指向的空间(通过使用取消引用运算符)指定值,您需要写:

    *a = 'c';
    
  2. 数组(char)不完全等于指针(对char)(另请参阅the question here)。但是,在大多数情况下,可以将数组(char)转换为(char)指针。

  3. 您的函数实际上更改了外部char数组(传回指向它的指针);不仅输入内容的大写由printf打印,而且word函数的变量main也将被修改,以便它保持输入单词的大写字母。请注意,这样的副作用实际上就是你想要的。如果你不希望函数能够修改外部变量,你可以写char* upper(char const *word) - 但是你也必须改变你的函数定义,这样它就不会直接修改{ {1}}变量,否则编译器会抱怨。

答案 1 :(得分:2)

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'

upper也可以实现为void upper(char *str),但是让upper返回传递的字符串更方便。当你printf上层返回的字符串时,你在样本中使用了它。

正如评论一样,您可以优化您的上层功能。您每strlen次致电i。 C字符串始终以空值终止,因此您可以将i < strlen(word)替换为word[i] != '\0'(或word[i] != 0)。如果您不与96和123进行比较并减去32,则代码最好是读取,但如果您检查并使用'a','z','A','Z'或您想到的任何字符进行计算。

答案 2 :(得分:0)

*单词即使是函​​数中的数组字指针和指针字实际指向同一个东西,同时传递参数jst一个“指针”的副本,即输入的单词被传递,无论如何操作完成是在指针字上完成的,所以最后我们必须返回一个指针,所以返回类型被指定为*。