【问题标题】:How to pass a scanf string to a global character array through pass-by-address in C++?如何通过C++中的地址传递将scanf字符串传递给全局字符数组?
【发布时间】:2011-10-20 03:53:23
【问题描述】:

让我马上说清楚,这是针对大学课程的。我不能使用 C++ 库,只能使用标准 C 库。不要建议我使用 C++ 字符串或 cin/cout,因为这对我的作业没有帮助。

我的问题:我在主函数中有全局字符数组。我需要在函数 foo() 中将字符串从 scanf() 传递给全局字符数组。一切都编译得很好,问题是 scanf() 函数似乎对它指向的全局字符数组没有影响。正如参考书所指示的那样,我正在使用“地址”运算符(&)。也许,我不了解字符数组指针和 scanf()“地址”(&) 之间的关系。我觉得我到处寻找解决方案。

我在这个问题上花了几个小时,所以我现在正在寻求专家的建议。

这是我的程序的简化版本。

#include <stdio.h>

void foo(char arr1[], char arr2[]);

int main(void)
{
    char arr1[20] = "initial";
    char arr2[25] = "second";

    foo(arr1); // <------- should change it to the string "second" upon scanf()

    printf("Test Return Value: %s\n",arr1); // <---- returns "initial" (the problem)

    printf("Enter a test value: ");
    scanf("%s", &arr1);

    printf("Test Return Value: %s\n",&arr1);

// ---------------------- this code is not part of the issue
fflush(stdin);
getchar();
return 0;
// ----------------------
}
void foo(char arr1[], char arr2[])
{
    // there will be many returned values

    printf("Enter a test value: ");
    scanf("%s", &arr1); // <---------- the problem function (input < 20 chars)
}

【问题讨论】:

  • 您在复制代码时犯了很多错误:从未使用过arr2 并且未声明arr

标签: c++ c scanf character-arrays


【解决方案1】:
scanf("%s", &arr); // <---------- the problem function (input < 20 chars)

应该是

scanf("%s", arr); // <---------- the problem function (input < 20 chars)

使用 C io 函数的危险!

【讨论】:

  • 很抱歉没有 1 的 arr,我想我在发布之前已经解决了这个问题。谢谢你。我不敢相信这很容易。
  • 使用 IO,通常很容易犯愚蠢的错误。这就是为什么我们有流库并且真的建议不要使用 strcpy 等。好的程序员都是懒惰的程序员——让自己轻松一点!
  • 哈,8 年后,我接受了这个答案,因为那时我应该有。感谢您的帮助。
【解决方案2】:

虽然您已经更新说已解决,但我有一些您可能需要考虑的观察结果:
1. 在scanfprintf 调用中,在arr1 之前删除&amp;(这已经解决了Ayjay 和Dennis 提到的问题)
2. 正确数量的未传递给函数foo 的参数(如Adrian Cornish 所述)。因此代码将无法编译。
3.fflush(stdin); 是未定义的行为。 fflush 仅用于输出流。请不要与stdin 一起使用。详情请参考this SO question
4. 如果这是 C++ 源代码,请使用#include &lt;cstdio&gt; 而不是#include &lt;stdio.h&gt;
始终编​​译带有完整编译器警告的代码并解决所有问题。这是一个很好的做法。 :)
希望这可以帮助!

【讨论】:

    【解决方案3】:

    scanf 函数的正确语法是:

    scanf("%s", arr);
    

    您只需要&amp; 运算符来处理简单变量,而不是数组/指针。

    除此之外,您还必须纠正对arr1arr2arr 的不当使用。您的部分代码使用前两个数组,其他部分使用后者。

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 2016-10-25
      • 2015-06-28
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      相关资源
      最近更新 更多