【问题标题】:Ignore whitespaces with isspace and getchar()使用 isspace 和 getchar() 忽略空格
【发布时间】:2014-06-14 15:12:59
【问题描述】:

我想用getchar() 从命令行读取数字,用isspace() 删除所有空格并用putchar() 打印它们。 但是,以下代码不会删除任何空格。输入10 1 导致输出10 1

你能帮我找出我的错误吗?谢谢!

int main(void){

    char input[UINT_MAX];
    int i = 0;
    while ( i < UINT_MAX && (input[i] = getchar()) != '\n' && !isspace(input[i])){
        i++;
    }
    if ( i == UINT_MAX ) {
        printf("Too long");
    }
    else {
        input[i] = '\0';
    }
    i = 0;

    while( input[i] ) {
        putchar(input[i]);  
        i++;
    }

    return 0;
}

请注意,我不允许使用任何额外的标题。我仅限于上述功能。

【问题讨论】:

  • 许多系统无法处理超过 1 MB 的堆栈大小,因此必须避免使用 char input[UINT_MAX];(假设 unsigned int 是 32 位)。
  • 您的代码按预期为我打印10(当我修复缓冲区大小时):ideone.com/CSSTEv

标签: c


【解决方案1】:

修复代码的最短方法(在使数组绑定一个合理的较小值之后,如 cmets 中所述)是从循环条件中删除 isspace(),而是将其添加到循环体中的 i++ 之前作为

  if isspace(input[i]) continue          

按原样,当您找到一个 ws 时,您会停止处理。相反,通过转发移动到下一个输入字符,而不增加 i。如果 i == bound,您还应该删除多余的检查,所以当前 else 子句中的内容总是被执行(如果最后一个字符是 ws,它需要被 '\0' 覆盖)。

【讨论】:

    【解决方案2】:

    为您的字符数组分配 4 GB 太疯狂了!选择一些合理的值并为其定义一个常量。

    #include <stdio.h>
    #include <ctype.h>
    
    #define MAX_INPUT 10000
    
    int main() {
      char input[MAX_INPUT + 1];
      int i = 0, c;
    
      while (i < MAX_INPUT && ((c = getchar()) != EOF) && c != '\n')
        if (!isspace(c))
          input[i++] = c;
      input[i] = '\0';
    
      for (i = 0; input[i]; i++)
        putchar(input[i]);
      putchar('\n');
    
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多