Как сканировать в два массива от пользователя? - PullRequest
0 голосов
/ 12 ноября 2008

Я относительно новичок в программировании, и мне нужно написать функцию, которая читает входные данные пользователя и заполняет два массива, а затем сравнивает их. Я думаю, что я запутался в том, как читать в обоих массивах.

Это то, что я должен делать,

Напишите функцию table_diff, которая сравнивает два массива целых чисел и возвращает нижний индекс первого места, в котором они отличаются. Если массивы одинаковы, функция должна вернуть -1, например:

345 и 345 -> -1 (то же самое)

345 и 346 -> 2 (отличаются по индексу 2)

1234 и 123 -> 3 (отличаются по индексу 3)

Это то, что я имею, любая помощь приветствуется!

while((r = scanf("%i", &value)) != 1 && ptra < endptra)
{
     *ptra ++ = value;                      

     if (r==1)
         printf("No room after reading values\n\n");
     else if(r != EOF)
         printf("invalid char");
}   

while((r = scanf("%i\n", &value))!= 1 && ptrb < endptrb){
    *ptrb ++ = value;

    if (r==1)
        printf("No room after reading values\n\n");       
    else if(r != EOF)
        printf("invalid char");                      
}

Ответы [ 6 ]

1 голос
/ 12 ноября 2008

Я думаю, что вы хотите изменить свой код на следующее:

while((r = scanf("%i", &value)) != 1 && ptra < endptra)
{
     *(ptra++) = value;                      

     if (r==1)
         printf("No room after reading values\n\n");
     else if(r != EOF)
         printf("invalid char");
}   

while((r = scanf("%i\n", &value))!= 1 && ptrb < endptrb){
    *(ptrb++) = value;

    if (r==1)
        printf("No room after reading values\n\n");       
    else if(r != EOF)
        printf("invalid char");                      
}

Оператор * имеет более высокий приоритет, чем ++.

0 голосов
/ 18 декабря 2008

Один из способов исправить ваши проблемы с циклами в программировании - это то, что я выучил на одном из моих университетских курсов около 15 лет назад. Это " инвариант цикла ".

Сделайте одно утверждение, которое всегда должно быть правдой. Внутри цикла условие может измениться, но убедитесь, что если вы выполните следующую итерацию, ваш инвариант снова будет действительным.

Как:

«Первые i позиции массивов одинаковы»

Итак, начните с 0 (всегда true), а во время цикла сначала проверьте, совпадает ли первая позиция. Если true, вы можете увеличить переменную 'i' на единицу. Сделайте то же самое со вторым и т. Д. Таким образом, переменная i в основном определяет, какой следующий индекс будет проверен.

Я уверен, что Интернет предоставит несколько лучших примеров, но это может помочь вам и в то же время повысить ваши навыки разработчиков.

0 голосов
/ 12 ноября 2008

Я не думаю, что Scanf работает так, как вы думаете, он работает. Трудно сказать, не видя, как вы делаете свой вклад; для такого цикла, я думаю, вам нужно будет отправлять EOF (CTRL-D из stdin) после каждой записи целого числа. Если это то, как вы это делаете, то единственное, что завершит ваш цикл - это сравнение указателей. У вас есть известный максимальный размер массива? Если, с другой стороны, ваш ввод «1234 ^ D», вы получите одну запись массива целого 1234, а не 1,2,3,4.

Наконец, оператор if выглядит так, как будто вы пытаетесь определить, почему завершился цикл; если это так, он должен быть вне цикла while.

0 голосов
/ 12 ноября 2008

Похоже, вам не хватает фактической части проверки. Теперь, когда вы прочитали каждый массив, вы должны пройти по нему с помощью другого цикла и проверить значение в каждом из них.

0 голосов
/ 12 ноября 2008

Кроме того, у вас есть случай copy - paste здесь. Вы делаете то же самое дважды. Что ты делаешь таким образом? Напишите функцию с общим кодом и вызовите ее только с соответствующими параметрами.

0 голосов
/ 12 ноября 2008

Это на самом деле не отвечает на ваш вопрос, но в состоянии «while» вы уже проверяете «r! = 1», поэтому в блоке while проверяется «if (r == 1) ...» является ненужным и технически недоступным кодом.

Какой смысл программы? Как это выглядит сейчас, вы читаете в массив ptra до пустой строки, затем читаете в ptrb до пустой строки ... затем вы говорите, что вам нужно сравнить два, но что вы подразумеваете под этим? каким должен быть результат? сравнить массивы элемент за элементом? или просто по содержанию, а не по положению? нужна дополнительная информация ...

...