通过函数传递字符串(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:如果您发现有帮助的答案,请记住接受它