c/c++语言开发共享C中的字符数组和scanf函数

我希望在下面的代码中得到错误,但我没有。 我没有使用&签名。 我也正在编辑char的数组。

 #include  int main() { char name[10] ="yasser"; printf("%sn",name); // there is no error , // trying to edit array of chars, // also did not use & sign. scanf("%s",name); // did not use strcpy function also. printf("%sn",name); return 0; } 

    我希望在下面的代码中得到错误,但我没有。我没有使用&sign。

     scanf("%s",name); 

    这完全没问题,因为name已经是字符数组的地址。

    当您将数组传递给C中的函数时,它们会衰减到指向第一个项目的指针。

    因此:

     char name[] ="yasser"; 

    scanf("%s", name)scanf("%s", &name[0]) ,这些调用中的任何一个都应该让你的脊椎发抖,因为除非你控制你的stdin (你通常不喜欢) ‘t),你正在将一个可能非常长的字符串读入有限的缓冲区,这是一个等待发生的分段错误(或者更糟糕的是,未定义的行为)。

    听起来你有几个问题:

    让我们稍微仔细看看你写的是什么,以及你没写的内容。

    声明和初始化char数组时,它与声明和初始化指向char的指针完全不同。 你写的时候

     char name[10] = "yasser"; 

    编译器为你做了什么就像你写的一样

     char name[10]; strcpy(name, "yasser"); 

    也就是说,编译器安排使用字符串常量中的字符初始化数组的内容,但是你得到的是一个普通的可写数组( 不是一个不可写的常量字符串常量)。

    另一方面,如果你写了

     char *namep = "yasser"; scanf("%s", namep); 

    你会遇到你期望的问题。 在这种情况下, namep是一个指针,而不是一个数组。 它被初始化为指向字符串常量"yasser" ,这是不可写的。 当scanf试图写入此内存时,您可能会遇到错误。

      以上就是c/c++开发分享C中的字符数组和scanf函数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/550075.html

      (0)
      上一篇 2021年1月14日
      下一篇 2021年1月14日

      精彩推荐