我希望在下面的代码中出错,但我没有。我没有使用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()">
答案 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)
听起来你有几个问题:
scanf("%s", name)
应该给出错误,因为%s
需要一个指针而name
是一个数组?但正如其他人所解释的那样,当你在这样的表达式中使用数组时,你总是得到(自动)指向数组的第一个元素的指针,就像你写了scanf("%s", &name[0])
一样。 / LI>
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
试图写入此内存时,您可能会遇到错误。
答案 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;}