一个小查询,C中的字符串

时间:2016-05-13 13:41:32

标签: c string codeblocks

最近我在我的代码块中进行编程,并且我只为C中的爱好做了一个小程序。

SUBSTRING(response_body,position('JLC' in response_body), 7) AS JLC

如果我创建了一个字符的字符串,为什么CodeBlocks允许我保存13个字符?

4 个答案:

答案 0 :(得分:5)

C没有边界检查,编译超出数组范围或动态分配的内存不能由编译器检查。相反,它会导致未定义的行为

为防止缓冲区溢出scanf,您可以告诉它只读取特定数量的字符,仅此而已。因此,要告诉它只读取一个字符,使用格式$http( method: 'GET', url: ''Home/GetAllProjects'', params: { parentId: JSON.stringify(selectedIdArray ) } )

作为一个小小的注释:请记住,C中的字符串中有一个额外的字符,终结符(字符"%1s")。因此,如果您的字符串应包含一个字符,则实际上该字符大小必须为两个字符。

答案 1 :(得分:2)

LittleString不是字符串。它是一个长度为1的字符数组。为了使char数组成为字符串,它必须以\0为空终止。

您正在写入已分配给littleString的内存。这是未定义的行为。

Scanf只是从控制台读取用户输入并将其分配给指定的变量,在本例中为littleString。如果您想控制分配给变量的用户输入的长度,我建议使用scanf_s。请注意,scanf_s不是C99标准

答案 2 :(得分:0)

实际上%d,%s ..是scanf和printf函数的占位符。 %s表示,接下一个参数并将其视为字符串。 这就是为什么不只有13,你可以输入你想要的字符数。 这段代码应该在代码块中工作。

答案 3 :(得分:0)

实现C中的许多功能而不检查使用的正确性。换句话说,callers责任是参数满足函数设置的一些规则。

示例:对于strcpy Linux手册页说

The strcpy() function copies the string pointed to by src, 
including the terminating null byte ('\0'), to the buffer 
pointed to by dest.  The strings may not overlap, and the 
destination string dest must be large enough to receive the copy.

如果你通过传递一个太小的缓冲区作为caller中断合同,你将会有未定义的行为,并且任何事情都可能发生。

程序可能会崩溃,甚至可能会在100次中的99次中完全达到预期效果,并且在100次中有1次做出奇怪的事情。