c-Debugger为strlen提供了一个分段错误



在下面的代码中,调试器没有显示错误,但当我在函数范围内运行这段代码时,char *s也在函数范围中,调试器会为strlen函数提供分段错误。添加char *s作为参数能解决问题吗?还是别的什么?

#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <locale.h>
#define SIZE1 100
#define SIZE2 2000
int main() {
const char *getFileExtension(const char *filename);
char tags[100][2000]; 
char files[100][2000]; 
char paths[100][2000];
char textfiles[100][2000];
char orph[100][2000];
int i, j, k = 0;
char *s;
for (i = 0; i < SIZE1; i++) {
if (strncmp(getFileExtension(files[i]), "txt", 3) == 0) {
strcpy(textfiles[k], files[i]);
k++;
}
}
k = 0;
for (i = 0; i < SIZE1; i++) {
for (j = 0; j < SIZE1; j++) {
if (strcmp(tags[i], textfiles[j]) != 0) {
snprintf(s, strlen(tags[i]), "%s", tags[i]);
s[strlen(s) - 1] = '';
strcpy(orph[k], s);
k++;
}
}
}
return 0;
}
const char *getFileExtension(const char *filename) {
const char *dot = strrchr(filename, '.');
if (!dot || dot == filename) 
return "";
return dot + 1;
}

EDIT:初始化char *s和其他数组后,我在devc++和www.onlinegdb.com上运行了代码。它一直在devc++上给我一个分段错误,但代码在网站上有效。

您声明了未初始化的数组

char tags[100][2000]; 
char files[100][2000]; 
char paths[100][2000];
char textfiles[100][2000];
char orph[100][2000];

因此,在标准的C字符串函数中使用它们,例如

if(strcmp(tags[i],textfiles[j])!=0)
{
snprintf(s,strlen(tags[i]),"%s",tags[i]);

调用未定义的行为。

函数getFileExtension似乎也没有在此调用中设置数组files的元素。

getFileExtension(files[i])

指针的

char *s;

用于本报表

snprintf(s,strlen(tags[i]),"%s",tags[i]);

也具有不确定的值。

标签数组没有初始化。所以strlen有未定义的行为。snprintf需要可用空间的大小,而不是(未初始化的(内容的长度。您应该在snprintf调用中使用sizeof而不是strlen。

snprintf的第二个参数是分配给第一个参数的大小。但你什么都没分配。

相关内容

  • 没有找到相关文章

最新更新