Как передать строку scanf в глобальный символьный массив через передачу по адресу в C++?

Позвольте мне сделать это прямо сейчас, это для класса колледжа. Я не могу использовать библиотеки C++, только стандартные библиотеки C. Не предлагайте мне использовать строки C++ или cin/cout, потому что это не поможет мне в этом назначении.

Моя проблема: у меня есть глобальные массивы символов в основной функции. Мне нужно передать строки в глобальные символьные массивы из функции scanf() в функции foo(). Все компилируется нормально, проблема в том, что функция 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 ответа

Хотя вы обновили поговорку "решено", у меня есть несколько замечаний, которые вы можете рассмотреть:
1. Избавиться от & до arr1 в scanf & printf звонки (которые решили вашу проблему, как уже упоминалось Ayjay & Dennis)
2. Правильное количество параметров, не переданных в функцию foo (как упомянул Адриан Корниш). Таким образом, код не будет компилироваться.
3. fflush(stdin); является неопределенным поведением. fflush только для выходных потоков. Пожалуйста, не используйте его с stdin, Обратитесь к этому так вопрос для деталей.
4. Если это источник C++, пожалуйста, используйте #include <cstdio> вместо #include <stdio.h>
Всегда компилируйте код с полными предупреждениями компилятора и разрешайте их все. Это хорошая практика.:)
Надеюсь это поможет!

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

должно быть

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

Опасности использования функций C io!

Правильный синтаксис для scanf функция:

scanf("%s", arr);

Вам нужно только & оператор для простых переменных, а не для массивов / указателей.

Кроме того, вам придется исправить неправильное использование arr1, arr2 а также arr, Части вашего кода используют первые два массива, остальные из последнего.

Другие вопросы по тегам