我正在尝试编写一个函数,使用 getchar() 从终端读取输入并将其存储在字符串中,然后以两种不同的格式显示。
我遇到的问题是,当用户输入的字符少于指定的长度时,必须按两次回车键,然后换行符也会存储在字符串中。 在其他位置找到的有关缓冲区的解决方案(我认为缓冲区是罪魁祸首)没有任何帮助。 欢迎任何建议和解释。 预先感谢。
这是我的代码的最后一个版本:
#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())中,我尝试删除任何存储的' '.
这是我的代码运行正常的版本。正如 @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);
}