Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Printf打印的字符比我的字符串中包含的字符多_C_Pointers_Printf - Fatal编程技术网

C Printf打印的字符比我的字符串中包含的字符多

C Printf打印的字符比我的字符串中包含的字符多,c,pointers,printf,C,Pointers,Printf,我必须写一个像外壳一样的程序。我编写了从用户那里获取输入的函数。我还编写了将其拆分为参数的函数。我第一次打字时,它工作得很好,但第二次,它在我给它的字符之后打印出不同的字符。我不必在程序中打印它。我只是想看看它是否能正常工作。我在网上读了很多东西,但我不能找出我的错误。我想它在makeArgs中,但我不能精确地指出它 另外,当我给它一个输入时,readline函数会在字符串的末尾添加一个\n。我想这是因为我按了回车键。我通过手动更换解决了这个问题,但我想知道它是否正常 任何帮助都将不胜感激。 多

我必须写一个像外壳一样的程序。我编写了从用户那里获取输入的函数。我还编写了将其拆分为参数的函数。我第一次打字时,它工作得很好,但第二次,它在我给它的字符之后打印出不同的字符。我不必在程序中打印它。我只是想看看它是否能正常工作。我在网上读了很多东西,但我不能找出我的错误。我想它在makeArgs中,但我不能精确地指出它

另外,当我给它一个输入时,readline函数会在字符串的末尾添加一个\n。我想这是因为我按了回车键。我通过手动更换解决了这个问题,但我想知道它是否正常

任何帮助都将不胜感激。 多谢各位

您已为该终止\0正确分配了内存,但在结尾处实际在哪里添加该\0

strncpy(chptr, &textEntre[j], i-j);
strncpy不一定为零终止目标缓冲区。你必须自己做

事实上,在这个特定的应用程序中,strncpy是一个相当不合适的函数:它与普通memcpy相比没有任何优势,而且可能效率更低。你可以这么做

memcpy(chptr, &textEntre[j], i - j);
具有潜在更好的效率。同样,不要忘记零终止目标缓冲区

或者,您可以使用sprintf实现以下相同的目的

sprintf(chptr, "%.*s", i - j, &textEntre[j]);

这将在目标中生成一个正确以零结尾的字符串。尽管你不会经常看到sprintf以这种方式使用。

这就解决了它!!非常感谢你!!我将其更改为memcpy并手动添加了\0。@ryker:这就是我通常的意思。strncpy的最初用途与以零结尾的字符串根本没有直接关系。
memcpy(chptr, &textEntre[j], i - j);
sprintf(chptr, "%.*s", i - j, &textEntre[j]);