c - 为什么下面的代码会在字符串末尾执行意外的字母?
问题描述
这是我的代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int countNumber(char string[],int number_[]);
int countNumber(char string[]);
int main(){
char string[] = "tran_huynh_minh_phuc";
int num = countNumber(string)+1;
int *number = (int *) calloc(num, sizeof(int));
countNumber(string,number);
for(int i=0;i<num;i++){
printf("%d\n",number[i]);
}
fflush(stdin);
char a[3][14];
strncpy(a[2], string+5, 5);
printf("%s",a[2]);
}
int countNumber(char string[],int *number)
{ int count=0;
int num_i=1;
number[0]=-1;
for(int i=0; i<strlen(string); i++)
{
if(string[i]=='_')
{ number[num_i] = i;
num_i++;
}
}
return count;
}
int countNumber(char string[])
{ int count=0;
for(int i=0; i<strlen(string); i++)
{
if(string[i]=='_')
{
count++;
}
}
return count;
}
这是我的问题控制台结果:
我正在执行程序以获取从“tran_huynh_minh”中获取“tran”、“huynh”、“minh”的子字符串,但是在我的子字符串末尾出现了一些意想不到的字母。此外,我尝试了很多方法来修复它,但它没有奏效。你能找出我的错误吗?
谢谢
明福
解决方案
我认为主块底部的意图是这样的(这在复制的 'huynh' 之后添加了空值。通过添加空值,当它开始打印2时,它知道何时停止。看起来就像希望将第二个单词放在数组中的索引 2 处(大概是在它工作时在循环中完成等等):
strncpy(a[2], string + 5, 5);
a[2][5] = '\0';
printf("%s", a[2]);
如果您运行与此等效的程序,您应该会看到预期的输出。但是,您可能还会看到有关 strncpy 函数的警告并考虑使用 strncpy_s(取决于您用于编译的内容。看起来您在 Windows 上)。如果您将函数调用替换为 strncpy_s(假设为 Visual Studio),您将获得所需的结果,而无需在末尾单独添加 null。请注意,它期望目标数组的大小作为保障(在本例中为 14)。
推荐阅读
- java - 将 ASCII 数值转换为字符
- coinbase-api - Coinbase Pro API 传输端点上缺少货币字段
- python - 如何使用python获取anki卡的渲染html
- google-cloud-functions - 通过 Auth0 Hook 调用 Google Cloud Function。如何将钩子来源的 IP 列入白名单?
- python - 使用 PyO3 将列表列表作为参数从 Python 传递给 Rust
- c# - EF Core:如何最好地聚合相关的实体属性
- python - 比较 2 个包含不同类型和 NaN 值的结构化数组
- r - 我可以使用差异分数作为回归分析的因变量进行中介分析吗?
- google-cloud-nl - 句子量级是否应该总是只返回情绪的绝对值?
- spring-boot - 间歇性 Hashicorp Vault 与春云 Mongo