在端子线上读/写问题

Problem with reading/writing on the terminal line

提问人:Alex 提问时间:9/22/2023 更新时间:9/23/2023 访问量:44

问:

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

  • 读取行应存储在字符串中,后跟 null 字符 ('\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()) 中,我尝试删除任何存储的“\n”。

C 字符串 缓冲区 getchar

评论

0赞 tadman 9/22/2023
请尝试使用较长的缓冲区进行调试,而不是更短的缓冲区。此外,考虑或反对非常不寻常的.while (1) { ... }for (;;) { ... }do { ... } while (1)
0赞 tadman 9/22/2023
在未初始化的缓冲区上操作时要小心。readLine
0赞 001 9/22/2023
必须按两次 Enter 键您在循环中调用了两次。flushBuffer();main
0赞 Alex 9/22/2023
我将其更改为 a,但这并没有解决我的问题。未初始化的缓冲区是什么意思?@tadmando whilewhile
1赞 Barmar 9/23/2023
您不使用内置的任何原因?fgets()

答:

0赞 Alex 9/23/2023 #1

这是我的代码版本,可以正常工作。正如 @Barmar 所建议的那样,flushBuffer() 函数使用所有字符,包括字符串中没有空格的换行符,在 while 循环未检测到“\n”的情况下联机调用。

#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);
}

评论

1赞 chux - Reinstate Monica 9/23/2023
while((getchar()) != '\n' );是文件结束时的无限循环。
1赞 chux - Reinstate Monica 9/23/2023
fflush(NULL);是很多潮红。如果您真的认为需要冲洗,请在打印线后考虑。fflush(stdout);