C中的字符数组和scanf函数

时间:2016-01-26 22:05:53

标签: c arrays scanf

我希望在下面的代码中出错,但我没有。我没有使用char标志。我也正在编辑#include <stdio.h> int main() { char name[10] ="yasser"; printf("%s\n",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("%s\n",name); return 0; } s。

的数组
<a href="#" ng-click="$event.preventDefault()">

5 个答案:

答案 0 :(得分:3)

  

我希望以下代码出错,但我没有。我没有使用&amp;登录。

<top frame>

完全没问题,因为scanf("%s",name); 已经是字符数组的地址。

答案 1 :(得分:3)

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

因此:

char name[] ="yasser";

scanf("%s", name)scanf("%s", &name[0])相同,并且这些调用中的任何一个都应该让您感到不安,因为除非您控制stdin上的内容(您通常不会这样做) #39; t),你正在将一个可能非常长的字符串读入有限的缓冲区,这是一个等待发生的分段错误(或更糟糕的是,未定义的行为)。

答案 2 :(得分:3)

听起来你有几个问题:

  1. 调用scanf("%s", name)应该给出错误,因为%s需要一个指针而name是一个数组?但正如其他人所解释的那样,当你在这样的表达式中使用数组时,你总是得到(自动)指向数组的第一个元素的指针,就像你写了scanf("%s", &name[0])一样。 / LI>
  2. scanf写入name应该会出错,因为name是用字符串常量初始化的吗?好吧,那是如何初始化的,但name确实是一个数组,所以你可以自由地写它(只要你不写超过10个字符到它,当然)。请参阅以下内容。
  3. 即使你没有打电话给strcpy,人物也被复制了?没有真正的惊喜,那里。同样,scanf刚写入您的数组。
  4. 让我们稍微仔细看看你写的是什么,以及你没有写的东西。

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

    char name[10] = "yasser";
    

    编译器为你做了什么就好像你写了

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

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

    另一方面,如果你写了

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

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

答案 3 :(得分:0)

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp) {
    char *myName = (char *) calloc(10, sizeof(char));
    *(myName)='K'; *(myName+1)='h'; *(myName+2)='a'; *(myName+3)='l'; *(myName+4)='i'; *(myName+5)='d';
    printf("%s\n",myName);
    scanf("%s",myName);
    printf("%s\n",myName);
    return (EXIT_SUCCESS);
}

答案 4 :(得分:0)

#include <stdio.h> 
#include <string.h>
int main()//fonction principale
{

char  name[10] ="yasser";
int longeur=0;
printf("%s\n",name);

scanf("%s",name);
longeur = strlen(name);
for (int i=0;i<longeur;i++) {
    printf("%c",*(name+i));
}
return 0;}