C编程打印字符数组

时间:2011-10-23 10:43:25

标签: c cstring

我有一个声明为:

的字符数组
char *array[size];

当我执行

printf("%s", array);

它给了我一些垃圾字符,为什么会这样呢?

http://www.cplusplus.com/reference/clibrary/cstdio/printf/

此url表示printf采用以下格式:`int printf(const char * format,...);

#include <stdio.h>
#include <string.h>
#define size 20
#define buff 100
char line[buff];

int main ()
{
    char *array[100];
    char *sep = " \t\n";

    fgets(line, buff, stdin);

    int i;

    array[0] = strtok(line, sep);

    for (i = 1; i < size; i++) {
        array[i] = strtok(NULL, sep);

        if (array[i] == NULL)
            break;
    }

    return 0;
}

4 个答案:

答案 0 :(得分:6)

你声明一个像这样的字符数组:

char foo[size];

你似乎把它与char *混为一谈,char *bar = foo; 是一个指向角色的指针。你可以说

bar

会使foo指向foo的内容。 (或者,实际上,// either print directly from foo: printf("%s", foo); // or print through bar: printf("%s", bar); 的第一个字符。)

要打印数组的内容,您可以执行以下操作之一:

\0

但请注意,C不会对变量内容进行初始化,因此除非您专门设置内容,否则您将获得垃圾。另外,如果那个垃圾没有碰巧包含{{1}};也就是说,一个值为0的char,它将继续输出超过数组的末尾。

答案 1 :(得分:3)

为什么我们这么简单的事情听起来如此困难?

char array[SIZE];
... /* initialize array */
puts(array);   /* prints the string/char array and a new line */
/* OR */
printf("%s", array); /* prints the string as is, without a new line */

数组中的 char 在你希望成为你的字符串结束之后(即如果你想让你的字符串读成“Hello”那将是下一个'o'之后的char必须是终止NUL字符'\ 0'。如果使用C函数读取将自动附加到缓冲区末尾的输入。如果您因为某些原因单独将字符写入缓冲区或某些内容,则只需要担心手动执行此操作。

编辑:与pmg的评论一样,'\ 0'可以在任何你希望字符串结束的地方,所以如果你想缩短你的字符串,你可以将它移到靠近前面,或者有一个空字符串你只有array[0] = '\0';。这样做也可用于在单个缓冲区内标记较小的字符串,就像 strtok 一样。即。 “第一部分\ 0Part2 \ 0Part3 \ 0”。但我认为这远离了问题的范围。

即。你想把字母表中的前3个字符存储为字符串(不知道为什么有人会这样做,但这只是一个例子):

char array[4];
array[0] = 'a';
array[1] = 'b';
array[2] = 'c';
array[3] = '\0';
printf("%s\n", array);

如果您有类似char array[] = "Hello";的内容,则会自动为您添加'\ 0'。

答案 2 :(得分:2)

您的数组未初始化,并且您还有一个指针数组,而不是char数组。它应该是char* array = (char*)malloc(sizeof(char)*size);,如果你想要一个char数组。现在你有一个指向数组第一个元素的指针。

答案 3 :(得分:0)

char *array[size];

array不是char *,它更像是char **(指向字符数组的指针,类似于指向char的指针)。

如果你只需要一个C字符串,那么:

char array[size];

并确保正确终止它,或

char *array;

并确保为其正确分配和释放存储空间(并且也将其终止)。