【发布时间】:2015-07-24 22:34:39
【问题描述】:
我有一个非常奇怪的问题。我基本上有一个接收char* 的函数,它拆分字符串并返回子字符串。我的问题是如果我打印 char* THEN 的长度然后返回它,那么值仍然存在,但如果我不调用函数来获取长度,那么当它从函数中出来时它就会消失。
我可能在上面解释得很糟糕,所以我将复制并粘贴下面的代码片段:
void processFile (char *currentLine, int currentLineNumber)
{
int type;
char *accountName, *secCodeRef, *secCode = NULL, *reference = NULL;
if ((type = getType(currentLine)) == TYPE_HEADER)
{
accountName = strtok (currentLine, " "); //Remove "Type"
accountName = strtok (NULL, " "); //Get Account Name
secCodeRef = strtok (NULL, " "); //get Security code and reference
secCode = getSecCode(secCodeRef, secCode); //Get Security Code
printf("TEST:%s\n", secCode);
}
基本上secCodeRef 是一个包含安全代码和参考(例如)GB0007980592REFERENCE1 的字符串。前 11 个字符是安全码,其余是参考。所以我把这个字符串传递给一个叫做getSecCode的函数:(SECCODELENGTH是13 btw)
char *getSecCode (char *secCodeRef, char *secCode)
{
char SecCode[SECCODELENGTH];
char *SecuCode = (char*)&SecCode;
memcpy(SecCode, &secCodeRef[START], SECCODELENGTH-1);
SecCode[SECCODELENGTH-1] = '\0';
printf("%d\n", getStringLength(SecuCode));
return SecuCode;
}
当这行运行时,它会提取SecuCode ok:
printf(%d\n, getStringLength(SecuCode));
结果是:(我正在从包含不同数据的文件中读取)
12
TEST:GB0007980592
12
TEST:GB0007980593
12
TEST:GB0007980594
哪个是正确的
但是当我注释掉时:
//printf(%d\n, getStringLength(SecuCode));
输出是:
TEST:
TEST:
TEST:
为什么 print 语句会影响返回值?
【问题讨论】:
-
请避免使用许多相同的名称。这非常令人困惑。并使用
char *SecuCode = (char*)&SecCode;而不是char *SecuCode = SecCode;。但这并不能解决您的问题。 -
我没有按照你说的去做。不过感谢您的命名建议。
-
请不要把
char写成Char。它们是两个不同的标识符。 (我已经编辑了你的问题。) -
@KeithThompson 抱歉,我没有意识到它们是不同的。我只真正了解 C 和(在较小程度上)Java。
-
C 和 Java 都区分大小写。