gpt4 book ai didi

C:在空输入时中断循环

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:07 24 4
gpt4 key购买 nike

所以我正在编写一个将永远循环的程序,接受字符串输入,直到用户只按下没有字符串的输入(在此过程中,我正在跟踪输入的最长/最短字符串)。我有这个循环:

char stringIn[1000] = {'\0'};
while(1) {
scanf("%[^\n]s", stringIn);
if(stringIn[0] == '\0') {
break;
}

if(strlen(stringIn) > strlen(longString)) {
longString == stringIn;
} else if (strlen(stringIn) < strlen(shortString)) {
shortString == stringIn;
}
i++;
}

目前这只是永远循环。我对 C 还是个新手,但对我来说这看起来应该行得通。

最佳答案

注意事项:

  1. 您可能将 == 运算符误认为是 =,这是赋值。即便如此,它也不会工作,因为在这里它只会复制缓冲区的地址(被覆盖)(实际上在我的代码中它会抛出编译时错误)。要复制字符串,您需要使用 strcpy
  2. scanf 非常容易受到缓冲区溢出的影响,并将分隔符留在缓冲区中。 fgets 是读取行的更好选择,因为它以缓冲区长度作为参数(检查 this)。
  3. scanf 填充其列表中的多个项目,直到读取与格式字符串匹配的字符。如果没有字符匹配,则它不会填充 stringIn,因此不会在末尾附加 '\0',这就是为什么您的代码永远不会转到中断;。相反,我们可以使用返回值,即它填充的列表的项目数(参见 here )。

无论如何,这里的代码可以满足您的需求:

int main() {
char stringIn[1000] = "";
char longString[2000] = "", shortString[2000] = "";
int read, firstFlag = 0;
while(1) {
read = scanf("%[^\n]", stringIn);
if (read == 0) {
break;
}
// to consume the '\n' left by scanf in the buffer
getchar();

if (!firstFlag || strlen(stringIn) > strlen(longString)) {
strcpy(longString, stringIn);
}
if (!firstFlag || strlen(stringIn) < strlen(shortString)) {
strcpy(shortString, stringIn);
}
firstFlag = 1;
}

printf("%s, %s\n", longString, shortString);
return 0;
}

更新:根据 Jonathan Leffler 的上述评论进行编辑,更正扫描集的使用。

关于C:在空输入时中断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46492157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com