Новичок не может понять, почему код ошибается, но знает, где он ошибается - PullRequest
1 голос
/ 29 сентября 2010

У меня проблема с моим кодом, хорошая новость в том, что я действительно определил проблему, плохая новость в том, что я не понимаю, почему это проблема. Также это должно быть возвращение или выход? Это моя функция getNums (), ... пока. Сначала мой код вызывает getLine (), которая получает строку и возвращает длину символа. Затем задается значение get nums, строка, длина строки и пустой массив для ввода чисел. Предполагается, что оно возвращает число только что введенных чисел.

int getNums(char s[], int endMarker, int numarray[])
{
    char c;
    double value;
    int counter =0;
    int i,j;
    for(i=0;i<endMarker;i++) {
        while ((c=s[i]!='\n')&&(c!=' ')) {
            //errors
            if ( (c<'0') || (c>'9') ) {
                return(-1); //was exit testing return, **this always kicks me out**
                if( counter > 6){
                    return(-2);
                } //was exit testing return
                s[i]=c;
                i++;
                value = value*10+'c'-'0';
            }else
                numarray[j]=value;
            j++;
            counter++;   
        }
        if ((c=getchar())==' ') {      
            i++;
        }
    }
    return (counter);
    printf("%c,%c:",counter,value); // for testing
}

Ответы [ 4 ]

7 голосов
/ 29 сентября 2010

c=s[i]!='\n' не делает то, что вы думаете, он делает.Оператор неравенства имеет более высокий приоритет, чем оператор присваивания.Переменная c будет установлена ​​в единицу, если s[i] не равна '\n', и будет установлена ​​в ноль, если она равна.

Вы должны либо переместить присвоение в более раннюю инструкциюили поставьте вокруг него скобки.

2 голосов
/ 29 сентября 2010

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

Во-вторых, форматирование довольно плохое.Например, отступ делает его похожим на то, что некоторые операторы контролируются if, который на самом деле не является.

В-третьих, вы не соответствуете типам, передавая int и double в printf, но используя% c (char) преобразование для обоих.

Возможно, есть и другие, но пока вы не исправите их (особенно отступ), попытка выяснить больше - это, вероятно, пустая трата времени.

1 голос
/ 29 сентября 2010

Я думаю, что вы должны хотя бы попытаться прочитать http://www.acm.uiuc.edu/webmonkeys/book/c_guide/introduction.html или что-то подобное, прежде чем пытаться решить вашу текущую проблему.Кажется, вы абсолютно не представляете, что делаете, после того, как вы хотя бы немного разберетесь в C, решение должно быть тривиальным.

1 голос
/ 29 сентября 2010

Есть несколько проблем с вашим кодом (кроме неправильного отступа).Я буду обращаться к ним так, как вижу их.

Не думаю, что вы хотите, чтобы в вашем цикле for был цикл while.Вы уже перебираете каждый символ в строке с for.Возможно, вы хотите проверить каждый символ по 'n' и ' ', для которого вы просто использовали бы if.

На второй взгляд кажется, что вы пытаетесь дважды повторить строку, потому что у вас есть два цикла и вы делаете i++ в двух разных местах.Это заставляет меня поверить, что вы не совсем продумали свой алгоритм.Я думаю, что вы должны сесть и написать какой-нибудь псевдокод.Перечислите шаг за шагом, что вы хотите, чтобы ваша функция выполняла простым языком, и убедитесь, что она логически понятна, прежде чем вы даже напишите строку кода.

Также, если вы return из функции,эта функция прекратит выполнение.Так что, если вы просто хотите пропустить выполнение итерации цикла, используйте вместо этого continue.Глядя на ваш код, я думаю, что у вас может быть return, где вы действительно хотите иметь continue.

Можете ли вы сделать отступ для своего кода, чтобы сделать его немного более читабельным и простым для понимания?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...