Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过函数传递字符串(C编程)_C_String_Function_Pointers_Uppercase - Fatal编程技术网

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

通过函数传递字符串(C编程),c,string,function,pointers,uppercase,C,String,Function,Pointers,Uppercase,我刚刚开始学习指针,在多次添加和删除*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

我刚刚开始学习指针,在多次添加和删除
*
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;
}
#包括
字符*上限(字符*字);
int main()
{
字符字[100];
printf(“输入字符串:”);
获取(单词);
printf(“\n大写等价物为:%s\n”,大写(word));
返回0;
}
字符*上限(字符*字)
{
int i;
对于(i=0;i96&&word[i],这是因为这里需要的类型只是“指向字符的指针”,它被表示为
char*
,星号(*)是参数类型规范的一部分。它不是“指向字符的指针”,而是写为
char**

一些补充意见:

  • 您似乎混淆了解引用操作符
    *
    (用于访问指针指向的位置)使用星号作为类型规范中的指针符号;在代码中的任何地方都没有使用解引用运算符;只使用星号作为类型规范的一部分!请参见以下示例:要将变量声明为指向char的指针,请编写:

    char * a;
    
    *a = 'c';
    
    要为
    a
    所指向的空间指定一个值(通过使用取消引用操作符),您需要编写:

    char * a;
    
    *a = 'c';
    
  • 数组(字符)并不完全等于指针(指向字符)(另请参见)。但是,在大多数情况下,数组(字符)可以转换为指针(字符)

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

  • 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
    upper返回的字符串时,您可以在示例中使用它


    作为注释,您可以优化上层函数。您正在为每个
    i
    调用
    strlen
    。C字符串总是以null结尾,因此您可以将
    i
    替换为
    word[i]!='\0'
    (或
    word[i]!=0
    )。此外,如果不与96和123进行比较并减去32,而是使用“a”、“z”、“a”、“z”或任何您想到的字符进行检查和计算,则最好阅读代码。

    即使函数中的数组字和指针字在传递时实际指向同一事物,但*字也是如此输入参数jst“指针对象”的副本,即输入的单词被传递,对指针单词执行任何操作,因此最终我们必须返回一个指针,以便将返回类型指定为*?函数upper要求一个指针作为参数,您提供一个指针(word)。据我所知,这是正确的方法。为了帮助消除混淆,请将
    word
    参数的名称更改为
    upper
    ,或者将代码中的局部变量
    word
    的名称更改为
    upper。为什么不在循环中使用?@Shashwat Mehta:如果您发现有帮助的答案,请记住接受它