当我尝试从 C 中的文件名中提取 2 位或 3 位数字字符串时,我遇到了这个奇怪的错误,有时它正确执行,有时却没有,输入文件名为“EC2_122016_1676_corte22_03012017084106.TXT” ,我只想要“corte22”中的“22”部分。
在这种情况下正确的结果应该是“代码: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;
}
最佳答案
在 extractNumbersFromString
中,您没有以 null 终止 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。
关于c - 在 C 中从字符串中提取数字时出现奇怪的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44892650/