c - 在 C 中从字符串中提取数字时出现奇怪的错误

标签 c string runtime-error

当我尝试从 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/

相关文章:

c - 当为 stdout 打开非阻塞 I/O 时,操作系统也为 stdin 打开它是否正确?

安卓错误 "Conversion to Dalvik format failed with error 2"?

c - 为什么这个程序会在执行时崩溃?

c - 释放分配给指针的内存与释放分配给指针指向的内存

c++ - 如何从 func_interpr 条目中获取变量的索引?

c++ - 只读取文本文件中的给定行?

python - 如何使用反斜杠 x\x 代码解码 ascii 字符串

c++ - 插入排序中的运行时错误

c - 将新字符串值分配给 char 数组时出错

string - 如何在 Swift 中将字符串转换为 UInt32