0

我在交流程序中有问题。我制作了一个函数,它对文本文件中的变量进行标记并将它们保存在一个集合中。问题是 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 编程方面没有太多经验,并尝试了很多东西,比如调试和打印输出以找到问题,但我还不知道。我希望有人能帮助我。

4

1 回答 1

0

更改以下内容

strncpy(out, text+start, end);

strncpy(out, text+start, end-start); 

如果 start = 6 和 end = 9 那么你复制的是 9 个字节而不是 3 个字节。

阅读有关堆栈粉碎的更多信息。

于 2013-11-08T17:10:47.147 回答