我尝试从C中的文件名中提取2位或3位数字字符串时出现这个奇怪的错误,有时它执行正确,有时它没有,输入文件名是“EC2_122016_1676_corte22_03012017084106.TXT” ,我只想把“22”中的部分说成“corte22”。
在这种情况下,正确的结果应该是“代码:022”,但是,有时它显示另一个值,如“代码:223”或“代码:224”,我对C没有太多经验等等,我无法解决为什么会这样,有什么帮助?
以下是我用来将文件名与代码分开的代码:
int main(int argc, char *argv[]) {
char *sourceFileName = "EC2_122016_1676_corte22_03012017084106.TXT";
char fileCode[4] = "\0";
strcpy(fileCode, extractFileCode(sourceFileName));
printf("Code: %s\n", fileCode);
}
char* extractFileCode(const char sourceFileName[]) {
char *tmp = strdup(sourceFileName);
strlwr(tmp);
char *result = strstr(tmp, "corte");
result = strtok(result, "_");
result = extractNumbersFromString(result);
char *t;
// convert the number back to string, but add a leading zero
sprintf(result, "%.3d", strtol(result, &t, 10));
free(tmp);
return result;
}
char* extractNumbersFromString(const char *source) {
char *result = malloc(strlen(source) * sizeof(char));
int index = 0;
int i;
for(i = 0; i < strlen(source); i++) {
if(isdigit(source[i])) {
result[index++] = source[i];
}
}
return result;
}
答案 0 :(得分:4)
extractNumbersFromString
中你没有终止result
(并且缓冲区太短),所以另一个数字可能会在缓冲区的末尾滑落。
修正:
char* extractNumbersFromString(const char *source) {
char *result = malloc(strlen(source) + 1);
int index = 0;
int i;
for(i = 0; i < strlen(source); i++) {
if(isdigit(source[i])) {
result[index++] = source[i];
}
}
result[index] = '\0';
return result;
}
除了* sizeof(char)
之外没用,因为总是1。