【问题标题】:using getchar() in C to send input to a char array在 C 中使用 getchar() 将输入发送到 char 数组
【发布时间】:2017-02-12 18:19:57
【问题描述】:

edit 我将 for 循环更改为一个名为 input 的函数,并在所述函数中初始化 c 的值。还更改了循环内的分支条件,以便在必要时将'\0' 插入到第五个元素。我最初的string1 溢出到string2 的问题仍然存在。我已经摆脱了fflush( stdin ),因为我不确定 Mac OSX El Capitan 是否支持它。

我有一个程序假设连接两个字符串,但我想确保用户不会过度填充数组的大小

现在,如果第一个字符串太长,它会将字符写入下一个字符串,这是不可取的——我的意图是简单地忽略超出数组空间的任何额外字符。

void input( char *s1, int size ){
  for( int i = 0, c = 0; ( i < size ) && ( c != '\n' ); i++ ){
      c = getchar();

      if( i == size - 1 || c == '\n' )
          s1[i] = '\0';
      else
          s1[i] = c;
  }
}

int main(){
  const int SIZE = 5;
  char string1[ SIZE ]; // create a char array
  char string2[ SIZE ]; // and another one

  printf( "Enter two strings: " );

  input( string1, SIZE );
  printf("String1: %s\n", string1);
  input( string2, SIZE );
  printf("String2: %s\n", string2);
}

示例输出...

Enter two strings: foobarr
String1: foob
String2: rr

我怎样才能改变这个,让'arr'被完全忽略,并且

getchar() 

在第二个函数调用中等待新的输入?

【问题讨论】:

  • 有两个(不相关的)问题:如果您读取的五个字符中没有换行符,您将得到一个未终止的字符串。此外,与您的问题更相关的是,使用stdin 之类的仅输入流调用fflush 在技术上是未定义的行为。在循环条件中使用它之前,您可能还需要考虑初始化 c
  • 至于你问的问题,只是阅读直到你得到一个换行符怎么样?
  • 请注意,只有部分平台支持Using fflush(stdin)
  • 您不能确保您的字符串以空值结尾。 string1string2 数组最多只能包含 4 个字符以及终止空字节。您还应该使用函数来读取数据,而不是为两个不同的变量重复循环。
  • 顺便说一句,您没有检查 getchar 返回 EOF (只需在 Unix 中尝试 ctrl+d 或在 Windows 中 ctrl+z + 输入,它应该会变得非常疯狂)。

标签: c validation security flush getchar


【解决方案1】:

好吧,这似乎可行,我得到了 clear_buffer() 函数 How to clear input buffer in C?.

void input( char *s1, int size ){

  for( int i = 0, c = 0; ( i < size ) && ( c != '\n' ); i++ ){
      c = getchar();

      // if we're out of space or the user is done with this string 
      if( i == size - 1 || c == '\n' ){

          // add null char to the array
          s1[i] = '\0';

          // if we added null char because we ran out of space
          if( i == size - 1 )
              clear_buffer();
      }
      //Otherwise add a char to the array
      else
          s1[i] = c;
  }
}

void clear_buffer(){
  char c = '\0';
  while (( c = getchar()) != '\n' && c != EOF) { }
}



int main(){
  const int SIZE = 5;

  printf( "Enter two strings: " );

  char string1[ SIZE ] = { '\0' }; // create a char array
  input( string1, SIZE );
  printf("String1: %s\n", string1);

  char string2[ SIZE ] = { '\0' }; // create another char array
  input( string2, SIZE );
  printf("String2: %s\n", string2);

  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2015-02-16
    • 2021-08-29
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多