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] != '\0')
newString[i] = myString[i];
}
newString[size - 1] = getch();
printf("%c",newString[size - 1]);
newString[size] = '\0';
free(myString);
return newString;
}
int main()
{
int size = 1;
char *myString = (char*)malloc((size + 1) * sizeof(char));
myString[0] = '\0';
do{
myString = increaseSize(myString, size);
size++;
} while (myString[size - 1] != 13 || myString[size - 1] != '\n');
printf("\n");
free(myString);
return 0;
}
想知道输入后的原因&#34;输入&#34;我的循环不会停止。
答案 0 :(得分:1)
看看这一行:
} while (myString[size - 1] != 13 || myString[size - 1] != '\n');
条件是“A是真或B是真的”,其中 A或B总是真实,因为它们相互补充!因为那个条件是“我有一个X,如果X不等于两个东西同时......”
解决方案:
} while (myString[size - 1] != 13 && myString[size - 1] != '\n');
答案 1 :(得分:0)
您的循环条件始终为真:
} 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');
答案 2 :(得分:0)
代码中的第一个问题是这句话:
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()
将读取该字符{{1}字符和程序将退出。在从用户读取字符后,您需要清理输入缓冲区。