请解释我需要追加' \ 0'将字符串转换为char时

时间:2015-12-30 15:16:07

标签: c++ mysql

对c ++使用proc / mysql时,我已将字符串作为用户输入并通过strcpy(c,s.c_str());函数转换为char,其中c是绑定变量,通过该变量我可以在其中添加值数据库表和s是字符串(用户输入),它工作正常,但我的老师要求我在最后附加'\0' - 我无法理解我需要的原因?

3 个答案:

答案 0 :(得分:2)

你的老师很迷惑。

# Your account access key - must have read access to your S3 Bucket $accessKey = "YOUR-ACCESS-KEY" # Your account secret access key $secretKey = "YOUR-SECRET-KEY" # The region associated with your bucket e.g. eu-west-1, us-east-1 etc. (see http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-regions) $region = "eu-west-1" # The name of your S3 Bucket $bucket = "my-test-bucket" # The folder in your bucket to copy, including trailing slash. Leave blank to copy the entire bucket $keyPrefix = "my-folder/" # The local file path where files should be copied $localPath = "C:\s3-downloads\" $objects = Get-S3Object -BucketName $bucket -KeyPrefix $keyPrefix -AccessKey $accessKey -SecretKey $secretKey -Region $region foreach($object in $objects) { $localFileName = $object.Key -replace $keyPrefix, '' if ($localFileName -ne '') { $localFilePath = Join-Path $localPath $localFileName Copy-S3Object -BucketName $bucket -Key $object.Key -LocalFile $localFilePath -AccessKey $accessKey -SecretKey $secretKey -Region $region } } 本身在创建字符串时为额外字符添加零[或更确切地说,c_str()保留空间,并确保至少在std::string点处为零返回 - 在C ++ 11中,保证在字符串末尾有一个额外的字符空间填充零,总是]。

您需要在字符串末尾加零,以在C样式字符串中标记字符串的结尾,例如c_str()使用的字符串。

[正如其他人所指出的那样,你也应该在复制之前检查字符串是否适合,如果它不适合我会建议拒绝,因为截断它会导致其他问题 - 以及检查是否存在'任何SQL注入攻击以及“在SQL环境中实现良好实践”所需的众多其他内容]

答案 1 :(得分:0)

虽然老师对追加' \ 0'对于字符串,您的代码展示了另一个非常糟糕的错误。

你应该从不以这种方式使用strcpy。您应该始终使用一些控制复制字符的nubmer的例程,如strncpy()或其他替代方法,并为其提供接收变量的大小。否则你只是在寻找麻烦。

答案 2 :(得分:-1)

猜测一下,它可以防止缓冲区溢出。如果c长度只有N个字节且s.c_str()返回指向N+k长度字符串的指针,则在k之后写入c个字节,这很糟糕。

现在让我们说(如果你还没有SEGFAULT)你将这个以c NUL结尾的字符串传递给C函数,你不能保证你在{{1}之后写的\0仍然在那里。然后,此C函数将在c之后读取未定义的字节数,这是 badder 更差。

无论如何,请使用c

::strncpy()