终端线上读/写问题

问题描述 投票:0回答:1

我正在尝试编写一个函数,使用 getchar() 从终端读取输入并将其存储在字符串中,然后以两种不同的格式显示。

  • 读取的行应存储在字符串中,后跟空字符('\o')。
  • 换行符不应存储在字符串中。

我遇到的问题是,当用户输入的字符少于指定的长度时,必须按两次回车键,然后换行符也会存储在字符串中。 在其他位置找到的有关缓冲区的解决方案(我认为缓冲区是罪魁祸首)没有任何帮助。 欢迎任何建议和解释。 预先感谢。

这是我的代码的最后一个版本:

#include <stdio.h>
#include <ctype.h>
#include <string.h>


#define LENGTH 4//30// i will try a shorter lenth for troubleshooting

void flushBuffer(void){
    while((getchar()) != '\n' );// consume the rest of a partially-read line
}
void readLine(char str[], int length){
    for(int j = 0; j < length - 1; j++){ 
        if(str[j] == '\n'){
            str[j] = '\0';
        }
    }
    int i = 0;
    do {
        str[i] = getchar();
        i++;
    } while (i < length - 1  && str[i - 1] != '\n');
    str[i] = '\0';
}
void printArray(char a[], int length){
  printf("[");
  for(int i = 0; i < length; i++){
    if(a[i] == '\n'){
      printf("\\n");
    }else if(a[i] == '\0'){
      printf("\\0");
    }else{
      printf("%c", a[i]);
    }
    if(i != length - 1){
      printf(",");
    }
  }
  printf("]\n");
}
void printChar (char c) {
  putchar(c);
  fflush(NULL);
}
void printString (char s[]) {
  int currentChar = 0;
  printf("\"");
  do{
  printChar(s[currentChar]);
  currentChar++;
  }while (s[currentChar] != '\0');
  printf("\"\n");
}
int main (void) {
  char inputString[LENGTH];
  do{
    printf("String? ");
    readLine(inputString, LENGTH);
    flushBuffer();
    printArray(inputString, LENGTH);
    printString(inputString);
    flushBuffer();
  }while(1);
}

我尝试编写一个应该刷新缓冲区的函数(flushBuffer()),并且在负责读取输入行的函数(readLine())中,我尝试删除任何存储的' '.

c string buffer getchar
1个回答
0
投票

这是我的代码运行正常的版本。正如 @Barmar 所建议的,flushBuffer() 函数消耗所有字符,包括字符串中没有空间的换行符,在 ' 的情况下在线调用 while 循环未检测到'。

#include <stdio.h>
#include <ctype.h>
#include <string.h>


#define LENGTH 30

void flushBuffer(void){
    while((getchar()) != '\n' );//^part of Question: consume the rest of a partially-read line
}
void readLine(char str[], int length){
    int i = 0;
    while (i < length - 1){
        str[i] = getchar();
        if (str[i] == '\n'){
          str[i] = '\0';
            return;
        }
        i++;
    }
    str[i] = '\0';
    flushBuffer();
}
void printArray(char a[], int length){
  printf("[");
  for(int i = 0; i < length; i++){
    if(a[i] == '\n'){
      printf("\\n");
    }else if(a[i] == '\0'){
      printf("\\0");
    }else{
      printf("%c", a[i]);
    }
    if(i != length - 1){
      printf(",");
    }
  }
  printf("]\n");
}
void printChar (char c) {
  putchar(c);
  fflush(NULL);
}
void printString (char s[]) {
  int currentChar = 0;
  printf("\"");
  while (s[currentChar] != '\0'){
  printChar(s[currentChar]);
  currentChar++;
  }
  printf("\"\n");
}
int main (void) {
  char inputString[LENGTH] = "";
  do{
    printf("String? ");
    readLine(inputString, LENGTH);
    printArray(inputString, LENGTH);
    printString(inputString);
  }while(1);
}
© www.soinside.com 2019 - 2024. All rights reserved.