函数调用中未填充 C 字符串

标签 c pointers c-strings

我正在尝试使用函数填充一些字符串,但这些字符串似乎没有正确填充。 print 语句只有 4 个空行。但是如果我取消注释 char ** pls 行,即使我从未在任何地方使用变量 pls,它也会正确打印所有三个字符串。在没有 pls 变量存在的情况下,它也可以在 Debug模式下正常运行。我不完全确定我做了什么让它不高兴的事情。

char * dataFile = (char *) calloc(64, sizeof(char));
//char ** pls = &dataFile;
char * queryFile = (char *) calloc(64, sizeof(char));
char * outFile = (char *) calloc(64, sizeof(char));
for(i = 1; i <argc; ++i)
{
    char command[3];
    char * iterator = argv[i];
    command[0] = *iterator;
    ++iterator;
    command[1] = *iterator;
    ++iterator;
    command[2] = *iterator;

    if(strcmp(command, "df=") == 0)
        determineFileString(iterator, &dataFile);
    else if(strcmp(command, "if=") == 0)
        determineFileString(iterator, &queryFile);
    else if(strcmp(command, "of=") == 0) 
        determineFileString(iterator, &outFile);
}
printf("%s\n%s\n%s\n", dataFile, queryFile, outFile);

void determineFileString(char * iterator, char ** file)
{
    char * p = *file;
    ++iterator;
    while(*iterator != '\0')
    {
        *p = *iterator;
        ++p;
        ++iterator;
    }
    *p = '\0';
}

最佳答案

您正在调用strcmp,但第一个操作数不指向字符串。字符串定义为一些字符后跟一个空终止符。

如果 argv[i] 字符串短于 2 个字符,您的代码也会导致未定义的行为,因为您总是从中复制 3 个字符。

要解决此问题,请增大 command 并在末尾添加一个空终止符,或者使用 memcmp 而不是 strcmp。 (但要小心memcmp,因为如果两个对象至少没有与大小一样大,它也会导致 UB)。

这是一个可能的修复:

for(i = 1; i <argc; ++i)
{
    if ( strlen(argv[i]) < 3 )
         continue;

    if ( memcmp(argv[i], "df=", 3) == 0 )
        determineFileString(argv[i] + 3, &dataFile);

    else if    // etc.
}             

顺便说一句,defineFileString 函数不会执行任何缓冲区大小检查(它可能会缓冲区溢出)。我建议重新设计这个功能;也许它可以进行长度检查并在函数内调用realloc

关于函数调用中未填充 C 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33225263/

相关文章:

c - 为什么在写入使用字符串初始化的 "char *s"时会出现段错误,而不是 "char s[]"?

C 数组计数(初级)

c - 如何跨多个翻译单元共享不透明类型?

c - 堆栈内存地址区

android - 蓝牙串口通讯,HC-06模块转安卓手机

c - 为什么这会在一个系统上给我带来段错误,而在另一个系统上却不会?

c - 使用指针的矩阵乘法

c - 使用循环为指针赋值

c++ - 通过 dll 边界的 C 字符串

c - 使用 bsearch 和 cstring,没有结果