gpt4 book ai didi

C: strncpy 意外截断字符串

转载 作者:太空宇宙 更新时间:2023-11-04 06:18:58 25 4
gpt4 key购买 nike

我正在逐行读取文件,其中每一行的格式为:

“数字 1\t 数字 2”。

我正在使用 strtok 和 strncpy 拆分然后根据需要存储这两个值。但是,我发现在 strncpy 之后,number1 被截断了一位数。

关于为什么会这样以及如何解决它有什么想法吗?

为简单起见,我硬编码了一个 line_of_text 来模拟这个问题。

谢谢!

代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


int main()
{
char line_of_text[80] = " 18306000 \t 100\n";
// NB: There's a \t between the two values, the rest are spaces.

char* token;

int digits_per_num = 9;

char first_token[digits_per_num];
char second_token[digits_per_num];

token = strtok (line_of_text, "\t");

printf("first token: %s\n", token);

if (token != NULL)
{
strncpy (first_token, token, digits_per_num);
}

token = strtok (NULL, ",\t\n");
if (token != NULL)
{
strncpy (second_token, token, digits_per_num);
}


printf("first token copy: %s\n", first_token);
printf("second token copy: %s\n", second_token);

}

输出:

first token:  18306000
first token copy: 1830600<junk>
second token copy: 100

最佳答案

第一个 token 由 10 个字节组成:18306000\0

strncpy() 只写入适合目标缓冲区的空字符。但是你分配的一个字符太少了,所以它没有。

最简单的解决方法是在两个 strtok 调用的分隔符中包含空格:

token = strtok (line_of_text, " \t\n,");

我还建议使用 snprintf() 而不是 strncpy,这样您就可以始终保证在字符串末尾得到一个空字符。

关于C: strncpy 意外截断字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com