字符数组如何在C中工作

时间:2014-12-13 17:18:51

标签: c arrays

我已经开始自己学习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;?

2 个答案:

答案 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;
}