在Windows10中,c语言的结果不同

在Windows10中,c语言的结果不同,c,C,结果看起来像是bug! 在windows10和ubuntu中,代码结果是不同的 正如我所料,结果是: 如果输入5; 预期结果(在ubunt中工作) 五, 数字5 不能被3整除 5(它在windows 10中工作) 号码是5-35 可以被3整除 在Visual Studio中(Cl.exe退出代码2) 我不知道为什么在我的结果中附加了-35并且计算错误 在windows10eclipsecygwingcc中 #include <stdio.h> #include <stdlib.

结果看起来像是bug! 在windows10和ubuntu中,代码结果是不同的 正如我所料,结果是:

如果输入5; 预期结果(在ubunt中工作)

五, 数字5

不能被3整除

5(它在windows 10中工作) 号码是5-35

可以被3整除

在Visual Studio中(Cl.exe退出代码2)

我不知道为什么在我的结果中附加了-35并且计算错误

在windows10eclipsecygwingcc中

#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;

}
#包括
#包括
结构数字
{
int-num;
结构数字*下一步;
};
结构数字*createDigit(int-dig);
结构数字*追加(结构数字*结束,结构数字*新数字PTR);
无效打印编号(结构数字*开始);
结构数字*读取编号(无效);
无效自由编号(结构数字*开始);
整除树(结构数字*ptr);
内部主(空){
结构数字*开始;
start=readNumber();
printf(“编号”);
打印编号(开始);
if(可除树(开始))
printf(“可被3整除。\n”);
其他的
printf(“不能被3整除。\n”);
自由号码(开始);
返回0;
}
结构数字*createDigit(整数数字){
结构数字*ptr;
ptr=(结构数字*)malloc(sizeof(结构数字));
ptr->num=dig;
ptr->next=NULL;
返回ptr;
}
结构数字*附加(结构数字*结束,结构数字*新数字){
结束->下一步=newDigptr;
返回(结束->下一步);
}
无效打印编号(结构数字*开始){
结构数字*ptr=开始;
while(ptr!=NULL){
printf(“%d”,ptr->num);
ptr=ptr->next;
}
printf(“\n”);
}
无效自由编号(结构数字*开始){
结构数字*ptr=开始;
结构数字*tmp;
while(ptr!=NULL){
tmp=ptr->next;
免费(ptr);
ptr=tmp;
}
}
结构数字*读取编号(无效){
char c;//读取字符
int d;
结构数字*start、*end、*newptr;
start=NULL;
scanf(“%c”、&c);
而(c!='\n'){
d=c-48;//字符到整数
newptr=createDigit(d);
if(start==NULL){
开始=新PTR;
结束=开始;
}否则{
end=append(end,newptr);//彼此链接
}
scanf(“%c”、&c);
}
返回(启动);
}
整型整除树(结构数字*开始){
结构数字*ptr=开始;
int i=ptr->num;
整除=3;
while(ptr->next!=NULL){
i=ptr->next->num+(i%可除)*10;
ptr=ptr->next;
}
//printf(“\n%d\n”,i);
if(i%可除)返回0;
否则返回1;
}
五, 数字5 不能被3整除。 5. 号码是5-35
可以被3整除。

在windows上,您似乎读到了一个
\r
,它会给您-35,因为
\r
的值为13

您需要确保列表中不包含非数字

所以改变

while (c != '\n') {

或者,如果您想手动检查(而不是使用
isdigit


while(c>='0'&&c欢迎使用堆栈溢出。请阅读、获取、阅读以及。最后学习如何创建。您所给出的只是一个结构的定义。这里没有代码显示您正在尝试执行的操作。请使用其他人可以编译和运行的方法更新您的问题,这样可以复制您的问题。在这种情况下,th输入流一定是在二进制模式下打开的。我知道了,我真的很感谢你!
while (isdigit(c)) {
while (c >= '0' && c <= '9') {