提问人:Alex 提问时间:9/22/2023 更新时间:9/23/2023 访问量:44
在端子线上读/写问题
Problem with reading/writing on the terminal line
问:
我正在尝试编写一个函数,该函数使用 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”。
答:
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);
评论
while (1) { ... }
for (;;) { ... }
do { ... } while (1)
readLine
flushBuffer();
main
do while
while
fgets()