想在C中创建动态字符串,但不是那个程序会产生无限循环的输入字符

时间:2018-02-02 14:01:36

标签: 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] != '\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;我的循环不会停止。

3 个答案:

答案 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}字符和程序将退出。在从用户读取字符后,您需要清理输入缓冲区。