char *increaseSize(char *myString,int size) {
char *newString = (char*)malloc((size + 1) * sizeof(char));//new char[size + 1];
for (int i = 0; i < size; i++) {
if(myString[i] != ' ')
newString[i] = myString[i];
}
newString[size - 1] = getch();
printf("%c",newString[size - 1]);
newString[size] = ' ';
free(myString);
return newString;
}
int main()
{
int size = 1;
char *myString = (char*)malloc((size + 1) * sizeof(char));
myString[0] = ' ';
do{
myString = increaseSize(myString, size);
size++;
} while (myString[size - 1] != 13 || myString[size - 1] != 'n');
printf("n");
free(myString);
return 0;
}
想知道为什么输入"Enter"后我的循环没有停止。
请看这一行:
} while (myString[size - 1] != 13 || myString[size - 1] != 'n');
条件是"当 A 为真或 B 为真时",其中 A 或 B 始终为真,因为它们相互补充!因为那个条件是"我有一个 X,如果 X 不等于同时两件事......">
溶液:
} while (myString[size - 1] != 13 && myString[size - 1] != 'n');
代码中的第一个问题是以下语句:
size++;
从increaseSize()
返回后,您正在增加修改size
值(执行size++
(,然后检查myString[size - 1]
值。
将size++
移到increaseSize()
呼叫上方:
size++;
myString = increaseSize(myString, size);
第二个问题是||
while
条件下使用:
while (myString[size - 1] != 13 || myString[size - 1] != 'n');
将||
替换为&&
:
while ((myString[size - 1] != 13) && (myString[size - 1] != 'n'));
进行上述更改后,您的代码将面临另一个问题。
当您输入字符并按Enter
键时,n
字符将位于输入缓冲区中,在下次调用increaseSize()
函数时,getch()
将读取该杂散n
字符,程序将退出。您需要在从用户读取字符后清理输入缓冲区。
您的循环条件始终为真:
} while (myString[size - 1] != 13 || myString[size - 1] != 'n');
假设myString[size - 1]
等于 'n'
。 第二个条件为假,但第一个条件为真。 而且,如果任何一个操作数的计算结果为 true,逻辑 OR 运算符的计算结果||
为 true,因此结果为 true。 如果myString[size - 1]
是 13(更好:'r'
(,则同样适用。
你想要的是逻辑 AND 运算符&&
,它要求两个操作数都为 true 才能计算为 true:
} while (myString[size - 1] != 'r' && myString[size - 1] != 'n');