space 之后的字符没有被打印出来
Characters after a space is not being printed out
我使用字符数组从用户那里获取输入,然后显示输出。但是,每次我输入中间带有 spaces 的值时,只会打印 space 之前的第一个单词。
例如,这是我输入的内容:
Customer No.:
7877 323 2332
这将是输出:
Customer No.:
7877
我已经搜索了可能的解决方案,但似乎找不到合适的解决方案。
这是我的参考代码:
#include<iostream>
using namespace std;
int main()
{
char custNum[10] = " "; // The assignment does not allow std::string
cout << "Please enter values for the following: " << endl;
cout << "Customer No.: ";
cin >> custNum;
cout << "Customer No.: " << custNum << endl;
}
cin >> int_variable
将在到达不是数字有效部分的第一个字符时停止读取输入。 C++ 不认为空格是数字的一部分,所以它一遇到空格就停止读取。
您可以使用 std::getline
改为读入字符串,然后在转换为整数之前从字符串中删除空格。或者在这种情况下,您甚至不需要整数,可以将其保留为字符串。
除了 std::getline 之外,如果您要使用 C-style 字符串,请尝试以下代码:
int main() {
char* str = new char[60];
scanf("%[^\n]s", str); //accepts space a a part of the string (does not give UB as it may seem initially
printf("%s", str);
return 0;
}
另外,如果你绝对需要它是一个数字,那么使用 atoi
int ivar = std::atoi(str);
PS 别忘了得到 (!!dangerous!!)
char* str;
gets(str);
puts(str);
另一种选择是使用 std::basic_istream::getline 将整个字符串读入缓冲区,然后使用简单的 for
循环删除空格。但是当使用 plain-old 字符数组时 不要吝啬缓冲区大小 。 1000 个字符太长总比 one-character 太短要好得多。根据您的输入,custNum
的绝对最小大小为 14
个字符(显示的 13
加上 '[=16=]'
(nul-terminating) 个字符。(粗略的 rule-of-thumb,将最长的估计输入加倍——以允许 user-mistake、猫踩键盘等...)
在你的情况下你可以简单地做:
#include <iostream>
#include <cctype>
int main() {
char custNum[32] = " "; // The assignment does not allow std::string
int wrt = 0;
std::cout << "Please enter values for the following:\nCustomer No.: ";
if (std::cin.getline(custNum, 32)) { /* validate every input */
for (int rd = 0; custNum[rd]; rd++)
if (!isspace((unsigned char)custNum[rd]))
custNum[wrt++] = custNum[rd];
custNum[wrt] = 0;
std::cout << "Customer No.: " << custNum << '\n';
}
}
两个循环计数器rd
(读取位置)和wrt
(写入位置)只是用于循环原始字符串并删除发现的任何空格,nul-terminating再次剩下循环了。
例子Use/Output
$ ./bin/readcustnum
Please enter values for the following:
Customer No.: 7877 323 2332
Customer No.: 78773232332
也看看Why is “using namespace std;” considered bad practice? and C++: “std::endl” vs “\n”。现在养成好习惯比以后改掉坏习惯要容易得多...仔细看看,如果您有任何问题,请告诉我。
我使用字符数组从用户那里获取输入,然后显示输出。但是,每次我输入中间带有 spaces 的值时,只会打印 space 之前的第一个单词。
例如,这是我输入的内容:
Customer No.:
7877 323 2332
这将是输出:
Customer No.:
7877
我已经搜索了可能的解决方案,但似乎找不到合适的解决方案。
这是我的参考代码:
#include<iostream>
using namespace std;
int main()
{
char custNum[10] = " "; // The assignment does not allow std::string
cout << "Please enter values for the following: " << endl;
cout << "Customer No.: ";
cin >> custNum;
cout << "Customer No.: " << custNum << endl;
}
cin >> int_variable
将在到达不是数字有效部分的第一个字符时停止读取输入。 C++ 不认为空格是数字的一部分,所以它一遇到空格就停止读取。
您可以使用 std::getline
改为读入字符串,然后在转换为整数之前从字符串中删除空格。或者在这种情况下,您甚至不需要整数,可以将其保留为字符串。
除了 std::getline 之外,如果您要使用 C-style 字符串,请尝试以下代码:
int main() {
char* str = new char[60];
scanf("%[^\n]s", str); //accepts space a a part of the string (does not give UB as it may seem initially
printf("%s", str);
return 0;
}
另外,如果你绝对需要它是一个数字,那么使用 atoi
int ivar = std::atoi(str);
PS 别忘了得到 (!!dangerous!!)
char* str;
gets(str);
puts(str);
另一种选择是使用 std::basic_istream::getline 将整个字符串读入缓冲区,然后使用简单的 for
循环删除空格。但是当使用 plain-old 字符数组时 不要吝啬缓冲区大小 。 1000 个字符太长总比 one-character 太短要好得多。根据您的输入,custNum
的绝对最小大小为 14
个字符(显示的 13
加上 '[=16=]'
(nul-terminating) 个字符。(粗略的 rule-of-thumb,将最长的估计输入加倍——以允许 user-mistake、猫踩键盘等...)
在你的情况下你可以简单地做:
#include <iostream>
#include <cctype>
int main() {
char custNum[32] = " "; // The assignment does not allow std::string
int wrt = 0;
std::cout << "Please enter values for the following:\nCustomer No.: ";
if (std::cin.getline(custNum, 32)) { /* validate every input */
for (int rd = 0; custNum[rd]; rd++)
if (!isspace((unsigned char)custNum[rd]))
custNum[wrt++] = custNum[rd];
custNum[wrt] = 0;
std::cout << "Customer No.: " << custNum << '\n';
}
}
两个循环计数器rd
(读取位置)和wrt
(写入位置)只是用于循环原始字符串并删除发现的任何空格,nul-terminating再次剩下循环了。
例子Use/Output
$ ./bin/readcustnum
Please enter values for the following:
Customer No.: 7877 323 2332
Customer No.: 78773232332
也看看Why is “using namespace std;” considered bad practice? and C++: “std::endl” vs “\n”。现在养成好习惯比以后改掉坏习惯要容易得多...仔细看看,如果您有任何问题,请告诉我。