我在交流程序中有问题。我制作了一个函数,它对文本文件中的变量进行标记并将它们保存在一个集合中。问题是 string.h 中的 strncpy 函数在我的程序中表现得很奇怪。我将代码分解为最小的示例:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
void tokenizeWord(int *i, char *text);
int main() {
char *text = "hallo 123 test foo bar etc";
int i;
for (i = 0; i < 24; i++) {
switch(text[i]){
case ' ':
i++;
default:
tokenizeWord(&i, text);
}
}
return 0;
}
void tokenizeWord(int *i, char *text) {
bool eow = false;
int start = *i;
int end = start;
if (i != NULL) {
while (*i < strlen(text) && !eow) {
switch(text[*i]) {
case ' ':
end = (*i);
eow = true;
break;
default:
(*i)++;
break;
}
}
char out[8] = "";
strncpy(out, text+start, end);
out[end-start] = '\0';
printf("%s\n", out);
}
}
打印出来的第一个变量是“你好”,这是完全正确的行为。第二个变量已经包含“123 test”。但是因为我在 123 之后设置了 \0 ,所以其余的不会被打印出来。打印后,我立即得到*堆栈粉碎检测*中止。我认为问题在于,strncpy 函数试图写入超过 8 个字符,但我告诉函数从位置 6 到 9 的文本打印。那么为什么 strncpy 试图复制超过三个字符?
我在 C 编程方面没有太多经验,并尝试了很多东西,比如调试和打印输出以找到问题,但我还不知道。我希望有人能帮助我。