C 为什么要放一个'&';在a给我想要的结果之前?
我刚刚开始学习C语言,不太了解一些东西是如何工作的。我想制作一个程序,它接受字符串的输入并按原样打印。 这是我写的程序:-C 为什么要放一个'&';在a给我想要的结果之前?,c,string,printing,C,String,Printing,我刚刚开始学习C语言,不太了解一些东西是如何工作的。我想制作一个程序,它接受字符串的输入并按原样打印。 这是我写的程序:- #include <stdio.h> int main() { char a; scanf("%s",&a); printf("%s",a); } #包括 int main() { 字符a; scanf(“%s”、&a); printf(“%s”,a); } 我的第一个问题是没有任何输出
#include <stdio.h>
int main()
{
char a;
scanf("%s",&a);
printf("%s",a);
}
#包括
int main()
{
字符a;
scanf(“%s”、&a);
printf(“%s”,a);
}
我的第一个问题是没有任何输出。甚至不是我期望的第一个角色。
其次,当我在print语句变量前面加上一个“&”时,它的效果很好,即打印整个字符串
#include <stdio.h>
int main()
{
char a;
scanf("%s",&a);
printf("%s",&a);
}
#包括
int main()
{
字符a;
scanf(“%s”、&a);
printf(“%s”,和a);
}
为什么会发生这种情况?如果您想在
字符中读取类型,正确的格式说明符是%c
而不是%s
如果您想在字符中读取类型,正确的格式说明符是%c
而不是%s
在c中,每个变量都有自己的地址。当我们想要读取某些内容时,我们分别发送地址(并使用&
从变量中获取地址)
原因是,scanf()
需要修改a和b的值,但它们是scanf()的本地值
所以为了反映主函数变量a和b的变化,我们需要传递它们的地址。我们不能简单地按价值传递它们
例如:
scanf("%d %d", &a, &b);
但是,如果使用printf()
函数,因为我们只在输出控制台中打印变量的值,所以变量a和b的值不会发生任何更改。因此,不需要发送他们的地址
printf()的示例:
(另外,如果您想扫描字符,必须使用%c而不是%s)在c中,每个变量都有自己的地址。当我们想要读取某些内容时,我们分别发送地址(并使用&
从变量中获取地址)
原因是,scanf()
需要修改a和b的值,但它们是scanf()的本地值
所以为了反映主函数变量a和b的变化,我们需要传递它们的地址。我们不能简单地按价值传递它们
例如:
scanf("%d %d", &a, &b);
但是,如果使用printf()
函数,因为我们只在输出控制台中打印变量的值,所以变量a和b的值不会发生任何更改。因此,不需要发送他们的地址
printf()的示例:
(另外,如果您想扫描字符,您必须使用%c而不是%s)您是第二个示例,我的示例似乎有效,但实际上您正在调用未定义的行为,因此可能会发生任何事情
详细内容:
您有一个字符a
,并调用scanf(“%s”,&a)
;但是在这里,scanf()
会将整个以NUL结尾的字符串复制到您传递的地址中,因此即使您只键入一个字符,scanf也会将该字符复制到a中,并将调用未定义行为的'\0'
复制到&a+1
中,因此您的程序可能会崩溃、覆盖其他变量或。。。。如果要扫描整个字符串,必须定义一个数组,如chars[1024]
并调用scanf(“%s,s”)
。如果要扫描单个字符,请调用scanf(“%c”,“a”);
scanf()
,printf(“%s”,…)
中的链接用于打印整个字符串,因此需要一个char*
参数。这就是为什么在第一个示例中它没有打印任何内容(事实上,它又是未定义的行为)。要打印单个字符,请调用printf(“%c”,a);
你是我的第二个例子,看起来很有效,但事实上你正在调用未定义的行为,所以任何事情都可能发生
详细内容:
您有一个字符a
并调用scanf(“%s”,&a)
;但是这里是scanf()
会将整个以NUL结尾的字符串复制到您传递的地址中,因此即使您只键入一个字符,scanf也会将该字符复制到a中,'\0'
将调用未定义行为的内容复制到&a+1
中,因此您的程序可能会崩溃、覆盖其他变量或…如果您想扫描整个字符串,请必须定义一个数组,如chars[1024];
并调用scanf(“%s,s”)
。如果要扫描单个字符,请调用scanf(“%c”、&a)代码>
scanf()
,printf(“%s”,…)
中的链接用于打印整个字符串,因此需要一个char*
参数。这就是为什么在第一个示例中它没有打印任何内容(事实上,它又是一个未定义的行为)。要打印单个字符,请调用printf(“%c”,a)代码>
有几件事:
char
类型存储单个字符,而不是字符串。要存储字符串,您需要留出一个字符数组:
char a[20]; // stores a string up to 19 characters long
在C语言中,字符串是包含0值终止符的字符值序列。字符串存储在字符类型的数组中。由于该终止符,您需要一个宽度至少为N+1个元素的数组,以便存储长度为N个字符的字符串。
%s
用于printf
和scanf
的转换说明符期望其相应的参数具有typechar*
,而不是char
——它期望的是char
数组的第一个元素的地址。
除非它是sizeof
或一元&
运算符的操作数,或者是用于初始化声明中字符数组的字符串文字,否则“T
的N元素数组”类型的表达式将转换(“衰减”)为“指向T
的指针”类型的表达式,表达式的值将是第一个元素的地址。
将所有这些放在一起,您需要进行以下更改:
#include <stdio.h>
#define LENGTH 20
#define EXPAND(x) #x // I'll explain this in more detail below
#define STR(x) EXPAND(x)
#define LENGTH_FMT STR(LENGTH)
int main( void )
{
char a[LENGTH+1];
scanf( "%" LENGTH_FMT "s", a );
printf( "%s\n", a );
return 0;
}
扩展到
"%" STR(LENGTH) "%s"
"%" EXPAND(20) "%s"
"%" #20 "s"
"%" "20" "s"
扩展到
"%" STR(LENGTH) "%s"
"%" EXPAND(20) "%s"
"%" #20 "s"
"%" "20" "s"
扩展到
"%" STR(LENGTH) "%s"
"%" EXPAND(20) "%s"
"%" #20 "s"
"%" "20" "s"
哪个