繁体   English   中英

C 中的字符数组和 scanf 函数

[英]Char arrays and scanf function in C

我希望在以下代码中出现错误,但我没有。 我没有使用&符号。 我也在编辑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;
}

我希望在以下代码中出现错误,但我没有。我没有使用 & 符号。

scanf("%s",name);

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

听起来你有几个问题:

  1. 调用scanf("%s", name)应该会出错,因为%s需要一个指针,而name是一个数组? 但正如其他人所解释的,当你在这样的表达式中使用数组时,你总是(自动)得到一个指向数组第一个元素的指针,就像你写了scanf("%s", &name[0])
  2. scanf写入name应该会出错,因为name是用字符串常量初始化的? 嗯,这就是它的初始化方式,但name确实是一个数组,因此您可以随意写入它(当然,只要您写入的字符不超过 10 个)。 请参阅下面的更多信息。
  3. 即使您没有调用strcpy ,字符也会被复制? 没有真正的惊喜,在那里。 同样, scanf刚刚写入您的数组。

让我们稍微仔细看看你写了什么,你没有写什么。

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

char name[10] = "yasser";

编译器为你做的事情有点像你写的

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

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

另一方面,如果你写了

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

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

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

因此对于:

char name[] ="yasser";

scanf("%s", name)scanf("%s", &name[0]) ,这两个调用中的任何一个都应该使您的脊椎不寒而栗,因为除非您控制stdin (您通常不这样做) 't),您正在将一个可能很长的字符串读入有限的缓冲区,这是等待发生的分段错误(或更糟的是,未定义的行为)。

#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);
}
#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;}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM