[英]stack smashing detected because of strncpy
我的交流程序有問題。 我制作了一個函數,可以對文本文件中的變量進行標記化,並將它們保存為inot集。 問題是來自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);
}
}
打印出來的第一個變量是“你好”,這是完全正確的行為。 secound變量已經包含“ 123測試”。 但是因為我將\\ 0設置為123之后,其余的將不會被打印。 打印后,我立即發現*堆棧粉碎*中止。 我認為問題是,strncpy函數嘗試寫入8個以上的字符,但是我告訴該函數從位置6到9的文本進行打印。那么為什么strncpy嘗試復制3個以上的字符?
我沒有太多的C編程經驗,並且嘗試了很多事情,例如調試和打印輸出以查找問題,但是我還沒有任何線索。 我希望有人能幫助我。
改變以下
strncpy(out, text+start, end);
至
strncpy(out, text+start, end-start);
如果start = 6並且end = 9,那么您將復制9個字節而不是3個字節。
閱讀有關堆棧粉碎的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.