如何通过C ++中的pass-by-address将scanf字符串传递给全局字符数组?

时间:2011-10-20 03:53:24

标签: c++ c scanf character-arrays

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

我的问题:我在main函数中有全局字符数组。我需要在函数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)
}

3 个答案:

答案 0 :(得分:2)

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

应该是

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

使用C io功能的危险!

答案 1 :(得分:2)

虽然你已经解决了更新的说法,但我有一些你可能想要考虑的观察结果:
1.在&&amp; arr1scanf之前摆脱printf foo电话(已经解决了Ayjay&amp; Dennis提到的问题) 2.正确的参数数量未传递给函数fflush(stdin);(如Adrian Cornish所述)。因此代码不会编译 3. fflush是未定义的行为。 stdin仅适用于输出流。请不要将其与#include <cstdio>一起使用。有关详细信息,请参阅this SO question 4.如果这是C ++源代码,请使用#include <stdio.h>代替{{1}}
始终使用完整的编译器警告编译代码并解决所有问题。这是一个很好的做法。 :)
希望这可以帮助!

答案 2 :(得分:0)

scanf函数的正确语法是:

scanf("%s", arr);

对于简单变量,您只需要&运算符,而不是数组/指针。

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