函数调用中未填充 C 字符串
C string not being filled in function call
我正在尝试使用函数填充一些字符串,但这些字符串似乎没有正确填充。打印语句只有 4 个空行。但是,如果我取消注释 char ** pls 行,即使我从不在任何地方使用变量 pls,它也会正确打印所有三个字符串。它也可以在没有 pls 变量存在的调试模式下正常运行。我不完全确定我做了什么让它不高兴。
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 != '[=10=]')
{
*p = *iterator;
++p;
++iterator;
}
*p = '[=10=]';
}
您正在调用 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.
}
顺便说一句,determineFileString
函数不做任何缓冲区大小检查(它可能缓冲区溢出)。我建议重新设计这个功能;也许它可以进行长度检查并在函数内部调用 realloc
。
我正在尝试使用函数填充一些字符串,但这些字符串似乎没有正确填充。打印语句只有 4 个空行。但是,如果我取消注释 char ** pls 行,即使我从不在任何地方使用变量 pls,它也会正确打印所有三个字符串。它也可以在没有 pls 变量存在的调试模式下正常运行。我不完全确定我做了什么让它不高兴。
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 != '[=10=]')
{
*p = *iterator;
++p;
++iterator;
}
*p = '[=10=]';
}
您正在调用 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.
}
顺便说一句,determineFileString
函数不做任何缓冲区大小检查(它可能缓冲区溢出)。我建议重新设计这个功能;也许它可以进行长度检查并在函数内部调用 realloc
。