我是 C 编程的新手。经过几个小时的研究,我遇到了一个问题,但仍然无法解决。如果您需要示例,我将在下面粘贴我的(基本)源代码。问题基本上如下:
我有一个方法,成功返回 1,否则返回 0。它接受一个用作函数实际返回值的 int 指针,这意味着传递的指针由该方法修改。稍后我需要使用修改后的值。该行为应类似于 fgets 或 scanf 等函数中的缓冲区指针。这工作正常,直到我尝试从调用函数返回修改后的指针值。我收到一个访问冲突错误,并且 int 值是负最大值,resp。不明确的。我该如何正确地做到这一点?
我之前读过有关双指针的内容,但无法弄清楚如何将这种技术合并到我的程序中......双指针是正确的方法吗?
下面是我的源代码供引用:)
int validateInteger(int *out) {
char buffer[17];
fgets(buffer, 16, stdin);
if (sscanf(buffer, "%d")) {
*out = atoi(buffer);
return 1;
}
return 0;
}
int anotherFunction() {
int selection = 0;
while(1) {
printf("Print something...");
if (validateInteger(&selection) && selection >= 0 && selection <= 7) {
break;
} else {
clearScreen();
}
}
return selection;
}
int main() {
while(1) {
int sel = anotherFunction(); // THIS IS WHAT DOESN'T WORK!
switch (sel) {
case 0:
return 0;
default:
printf("Print some error msg here...");
return 1;
}
}
}
如有任何帮助,我们将不胜感激。 提前谢谢你们!
最佳答案
问题出在以下几行:
if (sscanf(buffer, "%d")) {
*out = atoi(buffer);
return 1;
}
- 您不需要同时使用
sscanf
和atoi
。您只需使用其中一个。 - 您忘记将
out
传递给sscanf
。当格式字符串包含%d
时,该函数会查找指向int
的指针以将数据读入其中。由于您没有传递该参数,程序会导致未定义的行为。在您的情况下,它会导致访问冲突错误。
使用
if (sscanf(buffer, "%d", out) == 1) {
return 1;
}
您也可以使用以下行代替前面的行。
*out = atoi(buffer);
return 1;
但是,使用这种方法检查错误的唯一方法是检查*out
的值是否为0
。如果 0
是合法值,则使用第二种方法并不好。因此,我推荐第一种方法。
关于c - 错误返回修改指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209205/