C fgets中新行的检测

C fgets中新行的检测,c,shell,prompt,fgets,C,Shell,Prompt,Fgets,我试图创建一个C程序,用作UNIX系统的简单命令行解释器。我使用fgets()读取用户输入,然后将输入存储在要解析的缓冲区中。如果唯一的用户输入是按enter键,我想重新发出提示。是否有方法检测返回键是否是在提示下输入的唯一键?下面是我迄今为止尝试过的一段代码: for (;;) { printf("$prompt$ "); fflush(stdout); fgets(commandBuffer, 200, stdin); /* remove trailing

我试图创建一个C程序,用作UNIX系统的简单命令行解释器。我使用fgets()读取用户输入,然后将输入存储在要解析的缓冲区中。如果唯一的用户输入是按enter键,我想重新发出提示。是否有方法检测返回键是否是在提示下输入的唯一键?下面是我迄今为止尝试过的一段代码:

for (;;) {
    printf("$prompt$ ");
    fflush(stdout);

    fgets(commandBuffer, 200, stdin);

    /* remove trailing newline:*/
    ln = strlen(commandLine) - 1;
    if(commandLine[ln] == '\n')
        commandLine[ln] = '\0';

    /* attempt to handle if user input is ONLY return key:*/
    if(commandLine[0] == '\n')
        continue;
你需要更换

 if(commandLine[0] == '\n')

上面的代码用NUL替换换行符。

您需要替换

 if(commandLine[0] == '\n')
ln = strlen(commandLine);
while (ln > 0 && commandLine[ln-1] == '\n')
    --ln;
commandLine[ln] = '\0';

上面的代码将换行符替换为NUL

ln = strlen(commandLine);
while (ln > 0 && commandLine[ln-1] == '\n')
    --ln;
commandLine[ln] = '\0';
是一种更紧凑的解决方案,用于处理诸如空输入之类的特殊情况


是一种更紧凑的解决方案,用于处理诸如空输入之类的特殊情况。

一种用于删除潜在新行的流行单行程序是

if (fgets(commandBuffer, 200, stdin)) {
  commandBuffer[strcspn(commandBuffer, "\n")] = '\0';
strlen(命令行)
返回0时,下面的出现问题。当输入行读取以空字符开始时会发生这种情况

否则表现得像


一个流行的删除潜在新线的一行是

if (fgets(commandBuffer, 200, stdin)) {
  commandBuffer[strcspn(commandBuffer, "\n")] = '\0';
strlen(命令行)
返回0时,下面的出现问题。当输入行读取以空字符开始时会发生这种情况

否则表现得像


对于
fgets()
返回零长度字符串的(罕见)情况,代码将失败得很惨。这可以通过检查sizeof来解决。@JFA请详细说明“检查sizeof”的帮助。@chux我对alk的声明做出了响应,但现在我想起来了,我想你应该改为
strlen
。我想用
sizeof
来做些别的事情。对于
fgets()
返回零长度字符串的(罕见)情况,代码会失败得很惨。这可以通过检查sizeof来解决。@JFA请详细说明“检查sizeof”有什么帮助。@chux我对alk的陈述做出了回应,但现在我想起来了,我想你想要的是strlen。我在想另一件事。