С языком результат отличается в Windows 10 - PullRequest
0 голосов
/ 11 июня 2019

Результат выглядит как ошибка! результат кода отличается в окне 10 и Ubuntu как я и ожидал, результат:

если ввод 5; ожидаемый результат (работает в убунте)

5 № 5

не делится на 3.

5 (работает в windows 10) № 5 - 35

делится на 3.

в Visual Studio (код выхода Cl.exe 2)

Понятия не имею, почему в моем результате указано -35 и неправильный расчет!

в окне 10 затмение Cygwin GCC

#include <stdio.h>
#include <stdlib.h>

struct digit
{
    int num;
    struct digit *next;
};
struct digit *createDigit(int dig);
struct digit * append(struct digit * end, struct digit * newDigptr);
void printNumber(struct digit *start);
struct digit *readNumber(void);
void freeNumber(struct digit *start);
int divisibleByThree(struct digit *ptr);

int main(void) {

    struct digit *start;
    start = readNumber();

    printf("The number ");
    printNumber(start);
    if (divisibleByThree(start))
        printf("is divisible by 3.\n");
    else
        printf("is not divisible by 3.\n");
    freeNumber(start);
    return 0;
}

struct digit *createDigit(int dig) {
    struct digit *ptr;
    ptr = (struct digit *) malloc(sizeof(struct digit));
    ptr->num = dig;
    ptr->next = NULL;
    return ptr;
}

struct digit * append(struct digit * end, struct digit * newDigptr) {
    end->next = newDigptr;
    return(end->next);
}

void printNumber(struct digit *start) {
    struct digit * ptr = start;
    while (ptr!=NULL) {
        printf("%d", ptr->num);
        ptr = ptr->next;
    }
    printf("\n");
}

void freeNumber(struct digit *start) {
    struct digit * ptr = start;
    struct digit * tmp;
    while (ptr!=NULL) {
        tmp = ptr->next;
        free(ptr);
        ptr = tmp;
    }
}


struct digit *readNumber(void) {
    char c; // read character
    int d;
    struct digit *start, *end, *newptr;
    start = NULL;
    scanf("%c", &c);
    while (c != '\n') {
        d = c - 48; // character to integer
        newptr = createDigit(d);
        if (start == NULL) {
            start = newptr;
            end = start;
        } else {
            end = append(end, newptr); // linked to each other
        }
        scanf("%c", &c);
    }
    return(start);
}

int divisibleByThree(struct digit *start){
    struct digit *ptr = start;
    int i = ptr->num;
    int divisible = 3;
    while( ptr->next!= NULL){
        i = ptr->next->num + (i % divisible)*10;
        ptr = ptr->next;
    }
    //printf("\n%d\n",i);
    if(i % divisible) return 0;
    else return 1;

}

5 № 5 не делится на 3. 5 № 5 - 35 делится на 3.

1 Ответ

4 голосов
/ 11 июня 2019

В Windows вы, кажется, читаете \r, что даст вам -35, потому что \r имеет значение 13.

Вы должны убедиться, что не включили не цифры в ваш список.

Так измени

while (c != '\n') {

до

while (isdigit(c)) {

или если вы хотите проверить вручную (вместо использования isdigit)

while (c >= '0' && c <= '9') {

Примечание: isdigit требуется #include <ctype.h>

Разные результаты в Linux и Windows объясняются тем, что у них разные определения для "новой строки". Linux только мы "\ n", в то время как окна используют "\ r \ n"

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