2013-04-20 15 views
0

我完全丧失了这一个。我无法弄清楚为什么这不起作用。具有NULL终止符的简单字符数组 - 除了当我输出它时,它不会终止!fprintf字符串终止的心理障碍

int file_create(const char *path) { 
    //trying to trap situations where the path starts with /.goutputstream 
    char path_left_15[16]; 
    strncpy(path_left_15, path, 15); 
    printf("%d\n", strlen("/.goutputstream")+1); 
    path_left_15[strlen("/.goutputstream")+1] = '\0'; 
    printf("%d\n", strlen(path_left_15)); 
    printf("path_left_15: %s\n", path_left_15); 
    //continue on... 
} 

这是我的输出:

> 16 

> 16 

>/.goutputstream\B7<random memory stuff> 

我想不通这是为什么不正确终止。我试着让这个数组变长,但我每次都得到相同的结果。我正在失去理智!

有人看到了吗?谢谢。

+1

** f ** printf?你没有传递文件指针。 – Kevin 2013-04-20 00:25:10

+0

'NULL'是一个扩展为空*指针*常量的宏。推测你的意思是“NUL终结者”,或者更好的是“终结者”。 – 2013-04-20 00:48:54

+0

你说得对,凯文。我的意思就是printf。接得好。 – Alex 2013-04-20 03:39:28

回答

1

您无法与数组绑定。而不是path_left_15[strlen("/.goutputstream")+1] = '\0';尝试path_left_15[15] = '\0';

您将截断字符串,但在打印时将是安全的。

+0

我知道这将结束与我意识到我可以是多么愚蠢。忘记什么时候从0开始计数以及从何时开始计数的另一个例子。谢谢! – Alex 2013-04-20 00:34:00

+0

顺便说一句,这不会截断我的字符串。通过将终止符添加到path_left_15 [15],这就是我的数组的16位 - 正是我想要的位置。再次感谢。 – Alex 2013-04-20 00:35:22

2

你的数组只有16个元素,你试图写入第17个元素。所以这是未定义的行为。

+0

我明白你的意思了。我不能相信我忽略了这一点。谢谢。 – Alex 2013-04-20 01:50:36