不使用函数的给定pgm的替代pgm

时间:2014-07-16 17:10:38

标签: c string

#include <stdio.h>

void lower_string(char*);


    int main()
   {
      char string[100];

      printf("Enter a string to convert it into lower case\n");
      gets(string);

      lower_string(string);

      printf("Entered string in lower case is \"%s\"\n", string);

      return 0;
    }

    void lower_string(char *string)
     {
       while(*string)
       {
       if ( *string >= 'A' && *string <= 'Z' ) 
       { 
           *string = *string + 32;
        } 
        string++;
       }
} 

在此计划中,如果我将*string替换为string[],该怎么办? 没有使用任何功能,任何人都可以帮助我编写上述程序吗? 请解释这是什么意思(* str)?

5 个答案:

答案 0 :(得分:4)

void lower_string(char *string);

void lower_string(char string[]);

在C中是等效的。char []类型的参数已调整char *类型。

当然string*运算符的操作数,如下所示:

while (*string)

然后您无法将其更改为string[],因为*这里是间接运算符而不是类型名称的一部分。

答案 1 :(得分:1)

两者之间没有区别,因为当一个数组传递给一个函数时,衰减会调整为一个指针。

我不会编写这样的代码,然后将其标记为C++,因为string是标准的库类名。

答案 2 :(得分:1)

<强> C-FAQ: Q-6.4

  

由于数组会立即衰减为指针,因此数组实际上永远不会传递给函数。您可以假装函数接收数组作为参数,并通过将相应的参数声明为数组来说明它:

void f(char a[])
{ ... }
     

从字面上解释,这个声明没有用,所以编译器转过来并假装你写了一个指针声明,因为这就是函数实际上会收到的内容:

void f(char *a)
{ ... }
     

谈论一个函数没有什么特别的错误,好像它“接收”一个数组,如果该函数传统上用于对数组进行操作,或者该函数在函数中被自然地视为一个数组。 />   这种类似数组的声明符转换为指针只能在函数形式参数声明中保存,而不是其他地方。

答案 3 :(得分:0)

符号[]在某种程度上基本等同于*。 您可以接受char[]并仍然将其视为指向*的指针,您可以接受char*作为参数并使用[]作为常规数组访问它 - 它&# 39;完全相同。 你总是得到一个指向内存中该点的指针,当它是一个用[]定义的数组时,指针将是常量(不能对它进行处理,只能访问它的位置) #39; s指向)。 当您使用char str[100];声明数组时,您实际上声明了const char*名为str并指向堆栈中的内存区域。

答案 4 :(得分:0)

他们几乎是一回事。例如,

sz[x];

的缩写
*(sz + x);

然而,当你写char *sz;时,所有的yau都是指针。温你写char sz[size];,你也得到一个数组。见haccks的回答。