在C

时间:2017-07-03 19:21:51

标签: c string runtime-error

我尝试从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;
}

1 个答案:

答案 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。