【问题标题】:How to store multiple lines of input?如何存储多行输入?
【发布时间】:2020-10-03 03:50:42
【问题描述】:

我正在尝试从用户那里读取多行输入。我下面的代码运行良好,但我的教授只允许我们在 switch 语句中使用“break”。这是我的以下功能:

void getaddress (char address [ ], int limit)
{

    int len = 0;

   while(fgets(address+len, limit, stdin))
   {
       if(strlen(address+len) == 1)
       break;

       limit = strlen(address);
       limit = limit - len;

       if(limit <= 0)
       break; 
   } 
}

【问题讨论】:

  • if (address[len] == '\n') goto done; 然后在循环 done:;} 之后。 (检查'\n' 会单独捕获Enter 作为fgets() 的输入)如果您使用strlen(address+len) == 1 检查其他条件,则可以使用它。
  • while (limit &gt; 0 &amp;&amp; fgets(…) != NULL) { … },注意不要像现在这样破坏limit。您的循环体需要以不同的方式计算新的限制。
  • 看来limit = strlen(address); 应该是len = strlen(address);——否则limit 是——每次迭代都会改变:)
  • 将其与您的阅读限制相结合,以保护您的limit @chux 在他的回答中显示,您将拥有一个可靠的例程。
  • Joana F.,缓冲区大小是否为 100,并且有 3 个长度为 40、40、40 的输入行,最后一行应该部分保存、丢失还是什么?

标签: c


【解决方案1】:

考虑简单地阅读直到没有空间作为while()循环的第一个测试。

void getaddress(char address[ ], int limit) {
  int offset = 0;
  while(offset + 1 < limit && fgets(address+offset, limit - offset, stdin)) {
    offset += strlen(address + offset);
  } 
}

如果size 中的fgets(ptr, size, stdin) 位于least 2 很重要,以避免出现问题。

【讨论】:

    【解决方案2】:

    我认为

     limit = strlen(address);//error
     len += strlen(address); // correct
    

    见下文

    void getaddress (char address [ ], int limit)
    {
    
        int len = 0;
    
       while(fgets(address+len, limit, stdin) && limit > 0)
       {
           switch(address[len]){
    case '\0': break;
    case '\n':case '\r': continue;
    default:;
    }
    
           len += strlen(address);
           limit -= len;
       } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多