我已经开始自己学习C.我正在使用Head First C。
以下程序对我来说有点混乱:
#include <stdio.h>
int main()
{
puts("Hello World!");
puts("Enter your favorite Number:");
char arrayOfNumbers[3];
scanf("%2s",arrayOfNumbers);
//printf(arrayOfNumbers);
char s[] = {'a','b','c','d','e'};
printf(s);
return 0;
}
该程序的输出是:
Hello World!
输入您最喜欢的号码:
1
abcde1
我不能得到的是,尽管我正在复制输入&#39; 1&#39;在数组arrayOfNumbers中,然后我打印数组&#39; s,输出包含我输入的1。如何将输入复制到数组&#39;?
答案 0 :(得分:1)
char s[]
缺少终止空字节'\0'
,并通过printf
读取数组末尾。所以我打算在堆栈上打印下一个值。像这样修复它,看看
#include <stdio.h>
int main()
{
puts("Hello World!");
puts("Enter your favorite Number:");
char arrayOfNumbers[3];
scanf("%2s",arrayOfNumbers);
//printf(arrayOfNumbers);
char s[] = {'a','b','c','d','e','\0'}; // see the added '\0' byte
printf(s);
return 0;
}
C中的字符串需要一个不可打印的字节来标记字符串的结尾,例如strlen
就有许多期望它的函数,printf
就是其中之一。如果您使用的是Linux,valgrind会告诉您有关它的信息
答案 1 :(得分:0)
检查以下代码: 你应该有一个以NULL结尾的字符串,以便printf打印字符串。 打印没有格式说明符的字符串可能很危险。如果你的字符串有一些格式指定符,比如%d或%s,那么printf()会期望在此之后会有一个参数,它可能会从你的堆栈中读取一些值。所以IMO你应该使用格式说明符%s来打印字符串
#include <stdio.h>
int main()
{
puts("Hello World!");
puts("Enter your favorite Number:");
char arrayOfNumbers[3];
scanf("%2s",arrayOfNumbers);
printf("%s\n",arrayOfNumbers); /* or printf(arrayOfNumbers); */
char s[] = {'a','b','c','d','e','\0'};
printf("%s",s); /* or printf(s); */
return 0;
}