想用C创建动态字符串,但代替那个程序对输入字符进行无限循环


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');

相关内容

  • 没有找到相关文章