Как передать строку scanf в глобальный символьный массив через передачу по адресу в C ++? - PullRequest
0 голосов
/ 20 октября 2011

Позвольте мне сразу это прояснить, это для класса колледжа. Я не могу использовать библиотеки 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 ]

2 голосов
/ 20 октября 2011

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

2 голосов
/ 20 октября 2011
scanf("%s", &arr); // <---------- the problem function (input < 20 chars)

должно быть

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

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

0 голосов
/ 20 октября 2011

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

scanf("%s", arr);

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

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

...