[英]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
已经是字符数组的地址。
听起来你有几个问题:
scanf("%s", name)
应该会出错,因为%s
需要一个指针,而name
是一个数组? 但正如其他人所解释的,当你在这样的表达式中使用数组时,你总是(自动)得到一个指向数组第一个元素的指针,就像你写了scanf("%s", &name[0])
。scanf
写入name
应该会出错,因为name
是用字符串常量初始化的? 嗯,这就是它的初始化方式,但name
确实是一个数组,因此您可以随意写入它(当然,只要您写入的字符不超过 10 个)。 请参阅下面的更多信息。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.