标签数组没有初始化。所以strlen有未定义的行为。snprintf需要可用空间的大小,而不是(未初始化的(内容的长度。您应该在snprintf调用中使用sizeof而不是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]);
也具有不确定的值。
snprintf的第二个参数是分配给第一个参数的大小。但你什么都没分配。