我有一个声明为:
的字符数组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;
}
答案 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;
并确保为其正确分配和释放存储空间(并且也将其终止)。