【问题标题】:For loop length problems对于循环长度问题
【发布时间】:2018-05-31 05:19:52
【问题描述】:

代码是在运行时输入字符串,但代码接受的字符串比提到的大小 n 小一?哪里出错了?

假设 n=3,但循环只运行了两次,即 n-1 次,因此只有两个字符串作为输入

int main(){
  int n; 
  cin>>n;
  char str[n][100];
  for(int i=0;i<n;i++)
  {
    char c; 
    int j=0; 
    while((c=getchar())!='\n') 
    {  
      str[i][j++] = c; 
    }  
    str[i][j] ='\0'; 
  }
} 

【问题讨论】:

  • 现在是learn how to debug your programs的好时机。
  • @Someprogrammerdude 编译器没有显示任何警告或错误
  • @SrjSunny 您遇到的实际问题是什么?这个问题有点令人困惑。代码乍一看似乎是正确的。
  • @pepperjack 当我输入 n=3 的大小时,循环仅运行 2 次,因此只占用两个字符串。我想知道为什么?
  • @pepperjack 请在您的编译器中尝试一次

标签: c++ arrays string c++11 for-loop


【解决方案1】:

它正在读取\n 返回字符(从您填写n 开始)并使第一个字符串为空。只需在第一次测试输入结束之前再执行一次getchar() 即可摆脱它。

为了稳健性,您也可以尝试:cin.ignore(INT_MAX);cin.clear();cin.sync();

示例(我的编译器不喜欢你的部分语法,所以我不得不重做它,专注于新的getchar

int main() {
    int n;
    cin >> n;
    char** str = new char*[n];
    for (int i = 0; i < n; i++)
        str[i] = new char[100];

    getchar();

    for (int i = 0; i<n; i++)
    {
        char c;
        int j = 0;
        while ((c = getchar()) != '\n')
        {
            str[i][j++] = c;
        }
        str[i][j] = '\0';
    }

    for (int i = 0; i < n; i++)
        delete[] str[i];
    delete[] str;
}

(是的,我知道我距离http://wiki.c2.com/?ThreeStarProgrammer 差 1 星,这样做只是为了回答问题。)

【讨论】:

  • 但不是在循环外声明的 n ang getchar 在循环内,我正在阅读 c 而不是 n,请您详细说明
  • 这与@SrjSunny 无关。当你cin&gt;&gt;n 时,它会在while ((c = getchar()) != '\n') 读取的cin 缓冲区中留下一个\n,这使得str[0] 为空。
  • 现在我明白了,非常感谢,但是为什么你要使用另一个 getchar() 不是在循环中的 n 之前保留一个 '=' 符号更好
  • @SrjSunny 如果可以解决问题,请点击答案左侧的复选标记。欢迎来到 StackOverflow :)。我使用了另一个getchar 来摆脱剩余的\n,我还包含了一个sn-p 代码,您可以使用它来提高健壮性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2012-01-14
  • 2017-12-10
  • 2016-01-24
  • 1970-01-01
相关资源
最近更新 更多