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