strncpy导致变量值未定义

strncpy导致内存重叠

// An highlighted block
#include
#include 
#include
#include"main.h"
void update(char *key,char *value){
	char szTest[30]={0};
	char test[4];/*一定要为\0留一个位置,不然会发生内存重叠*/
	char str[11];
	int flag=0;/*是否匹配到相应行的标志位*/
	int suc=0;/*是否更新成功的标志位*/
	FILE *fp =fopen("keyword.txt", "r+");
	if(NULL == fp)
	{
		printf("failed to open keword.txt\n");
	}
	if( strlen(value)>10){/*如果输入的value大于10,截取前边的*/
		strncpy(str,value,10);
		memset(value,0,sizeof(value));
		strcpy(value,str);
	}
while(!feof(fp))
{
	memset(szTest,0, sizeof(szTest));/*每次循环清空szTest*/
	fgets(szTest,sizeof(szTest)-1 ,fp);/*读一行*/
	strncpy(test,szTest,4);/*取每一行的前四个字符*/
	/*test[4]='\0';*/
	if(strcmp(key,test)==0){/*比较test和输入的字符串*/
		flag=1;
		fseek(fp,-21,SEEK_CUR);/*指针从行尾移到行首*/
		if(fprintf(fp,"%s %-10s",key,value)>=0){
		fflush(fp);
		suc=1;
	}else{
		printf("UPDATE FAIL\n");
	}
	flag=1;
}
}
	if(suc==1){
		printf("UPDATE SUCCESS\n");
	}
	if(flag==0)
	{ printf("Not found!\n");}
fclose(fp);
}

这是一段更新txt文件内容的代码。keyword.txt文件中的内容为:
1111 aaaaaaaaaa
2222 bbbbbbbbbb
3333 cccccccccc
4444 dddddddddd
其中,1111为key,aaaaaaaaaa为value。
**要求:**输入UPDATE 1111 1234567890,则txt文件1111对应value改为1234567890
**问题:**当我输入 UPDATE 1111 FSFDJFHSLGHSKG(value过长时),test(txt中的key),与我输入的key判断为不相等。当输入的value<=10时,结果正确。
**解决:**在AIX系统下没法调试,于是我打印了test和key的内容,如下图:

那么问题来了,很明显的看出,test的前半段时正确的“key”,而后半段时我输入的value。可是这两个变量毫无关系。test取自szTest的前四个字符,szTest为读取的txt中的一行,我打印了szTest的值,发现szTest的值正确,那问题就出在了test身上。于是我百度了strncpy的用法,想知道他为啥把我的test给copy成了那个样子。
我看到了这篇博客关于strncpy这个函数
Strncpy一个终止的空字符处停止。当n>strlen(s1)时,给s2不够数的空间里填充“\0”;当n<=strlen(s1)时,s2是没有结束符“\0”的。
char *strncpy(char *s2, const char *s1, size_t n);
注意:

  • 使用strncpy或memcpy时,n应该大于strlen(s1),或者说最好n >= strlen(s1)+1;这个1 就是最后的“\0”。
  • 使用strncpy时,确保s2的最后一个字符是“\0”。

——看到这里我就知道问题出在哪里了。我的test里需要放四个有效字符,而我定义的是char test[4],这样的变量,结果是为定义的,所以应该为:test[5],为‘、0’留出一位来。

另外,附strcpy、strncpy与memcpy的区别与使用方法

你可能感兴趣的:(C)