结果看起来像是虫子! 代码结果在窗口10和ubuntu中是不同的 我预期的结果是:
如果输入5; 预期结果(在ubunt中有效)
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整除。
答案 0 :(得分:4)
在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”,而Windows使用“ \ r \ n”