我想我在终止字符串时遇到了问题,因为我在显示它们时遇到了问题。我正在尝试用 C 重新创建 unix ar 命令,我几乎已经布置了 -v,但现在我已经在那里获得了权限,我似乎无法正确打印它们。
我在perms数组的末尾添加了一个终止字符,这有助于显示权限,但现在日期不想打印。
当我将日期放在单独的字符串中时,日期可以正常打印,但是当它与其他所有内容一起出现在组合格式字符串中时,它会消失。
void verbose(char *archive){
mode_t mode;
size_t readNum;
time_t mtime;
struct tm * time_box;
long long arch_size, file_size;
long uID, gID;
char header[60], file_name[16], time[21], perms[8];
char* tokens;
FILE *fp = fopen(archive, "r");
if (!fp)
fail('f');
//get file size
fseek(fp, 0, SEEK_END);
arch_size = ftell(fp);
rewind(fp);
//move over ARMAG
if(fseek(fp, strlen(ARMAG), SEEK_SET) != 0)
fail ('z');
//loop over files
while(ftell(fp) < arch_size -1){
//reads header into
readNum = fread(header, 1, sizeof(header), fp);
if(readNum != sizeof(header))
fail('r');
tokens = strtok(header, " ");
strcpy(file_name, tokens);
mtime = (time_t)(atol(tokens = strtok(NULL, " ")));
uID = atol(tokens = strtok(NULL, " "));
gID = atol(tokens = strtok(NULL, " "));
mode = (mode_t)(strtoul(tokens = strtok(NULL, " "), NULL, 8));
file_size = atoll(&header[48]);
time_box = localtime(&mtime);
strncpy(time, &asctime(time_box)[4], 20);
printf("Time is %sn", time);
perms[0] = mode & S_IRUSR? 'r' : '-';
perms[1] = mode & S_IWUSR? 'w' : '-';
perms[2] = mode & S_IXUSR? 'x' : '-';
perms[3] = mode & S_IRGRP? 'r' : '-';
perms[4] = mode & S_IWGRP? 'w' : '-';
perms[5] = mode & S_IXGRP? 'x' : '-';
perms[6] = mode & S_IROTH? 'r' : '-';
perms[7] = mode & S_IWOTH? 'w' : '-';
perms[8] = mode & S_IXOTH? 'x' : '-';
perms[9] = ' ';
printf("%s"
"t%ld"
"/%ld"
"tt%lld "
"%s "
"%sn", perms, uID, gID, file_size, time, file_name);
//move over file
if(fseek(fp, file_size, SEEK_CUR) != 0)
fail ('z');
}
fclose(fp);
}
示例输出:(偶数行中也应该有时间(
Time is Jan 27 16:23:59 2013
rw-r--r-- 502/20 28 - b.txt
Time is Jan 27 16:24:06 2013
rw-r--r-- 502/20 17 - c.txt
Time is Jan 27 16:24:15 2013
rw-r--r-- 502/20 28 - d.txt
Time is Jan 27 16:24:06 2013
rw-r--r-- 502/20 17 - c.txt
您正在分配大小为 8
的perms[8]
。因此,此选项卡的有效索引将为 [0-7]。
在分配超出perms
数组边界的perms[8] = mode & S_IXOTH? 'x' : '-';
和perms[9] = ' ';
之后。
您的time
数组必须紧随内存中的perms
之后。 所以perms[8]
和perms[9]
表现得好像你在影响time[0] = '-'
然后time[1] = ' '
.
time
现在等于-
,printf 正确显示它。
只需将perms[8]
声明更正为 perms[10]
,即可影响良好变量内存部分的值。