本篇博客介绍一下,从键盘上输入一个字符串引发的问题。
读取一行以空格分隔的字符串
C语言
首先,我们先来看一个代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[1024];
scanf("%s", str);
printf("str: %s\n", str);
system("pause");
return 0;
}
可以看到空格后的字符串没有被读取到,这是因为%s就是遇到第一个空白字符停止的。
如果我们想要读取一个带空格的字符串,该如何操作呢?下面看代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main() {
char str[1024];
scanf("%[^\n]", str);
printf("str: %s\n", str);
system("pause");
return 0;
}
其中,%[^characters]
表示遇到characters就停止读取。
C++
我们先来看常用的cin:
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main() {
string str;
cin >> str;
cout << "str: " << str << endl;
system("pause");
return 0;
}
可以看到,cin和%s情况一样,遇到第一个空白字符就会停止读取。
我们可以使用string的成员函数getline来读取一个以'\n'
结束的字符串:
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main() {
string str;
getline(cin, str);
cout << "str: " << str << endl;
system("pause");
return 0;
}
我们来看下面一个问题:
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main() {
string str;
cin >> str;
cout << "str: " << str << endl;
getline(cin, str);
cout << "str: " << str << endl;
system("pause");
return 0;
}
为什么,getline什么都没有读到。这是因为,cin
将"hehe\n"
放入输入缓冲区,而cin >> str;
从其中将"hehe"
取走,剩下一个"\n"
就被getline函数刚好读走。
想要解决这个问题,我们可以每次输入一个字符串之后,都刷新一下输入缓冲区:
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main() {
string str;
cin >> str;
cout << "str: " << str << endl;
fflush(stdin);
getline(cin, str);
cout << "str: " << str << endl;
system("pause");
return 0;
}
Java
同样的,我们先来看一段代码:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
String str = "";
Scanner scanner = new Scanner(System.in);
str = scanner.next();
System.out.println("str: " + str);
}
}
读取一个以回车结束的字符串方式如下:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
String str = "";
Scanner scanner = new Scanner(System.in);
str = scanner.nextLine();
System.out.println("str: " + str);
}
}
同样的,这里也存在和C++中一样的问题:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
String str = "";
Scanner scanner = new Scanner(System.in);
str = scanner.next();
System.out.println("str: " + str);
str = scanner.nextLine();
System.out.println("str: " + str);
}
}
解决方法是同样的,刷新输入缓冲区即可。