这是我的代码:
char A[10];
char B[5];
cin >> setw(10) >> A;
cin >> setw(5) >> B;
cout << A;
cout << B;
如果输入超过数组大小(例如:A
变量为 10),则程序不会提示我输入第二个数组的数据。它直接走到最后并执行两条"cout"线。
输入:abcabcabcabcabcabc
(代表 A)
输出:abcabcabcabca
(字符 13 个空格 + 2 '')
预期输出:
abcabcabc
(用于 A)
dddd
(用于 B)
数据,即使我为其中一个变量输入了太多字符
在C++中,你会这样做,如下所示
std::string A,B;
std::getline(std::cin,A);
std::getline(std::cin,B);
这避免了固定大小数组的任何陷阱,例如char[10]
和读取整行。或者,您可以添加分隔符
const auto delim = '.'; // say
std::getline(std::cin,A,delim);
std::getline(std::cin,B,delim);
我认为没有一种简单的方法(即不自己编码)允许多个分隔符。
如果你想读取具有固定限制的 C 字符串,最好的方法是使用 fgets
,这是标准C++库的一部分。
你也可以使用 iomanip
来setw
,像这样:
char A[10];
char B[15];
cin >> setw(10) >> A;
cin >> setw(15) >> B;
请注意,您返回的字符串的长度将小于您设置的宽度 1,因为 C 字符串需要 null 终止。
演示。
注意:尽管这种 C 和 C++ 的混合是可行的,但您最好将 std::string
用于更惯用C++的方法。我承认这可能是一个学习练习,你不允许使用std::string
,不过。
当您使用 C++ 时,您可以使用string
string A,B;
cin>>A>>B;
在这里,您可以扫描任意数量的字符。
坚持使用C函数,你有几个选择。
第一种选择是利用fgets
在其读取的字符串中包含换行符的事实,但前提是它停止读取的原因是因为它点击了行尾。 您可以检查最后一个字符是否是换行符,如果不是,则丢弃输入中剩余的任何内容,包括下一个换行符:
int count;
fgets(A, 10, stdin);
count = strlen(A);
if (count == 9 && A[8] != 'n') {
do {} while (getc(stdin) != 'n');
}
fgets(B, 15, stdin);
printf("A: %s; B: %sn", A, B);
如果不希望字符串中使用换行符,请务必将其删除。 您可能希望将过多的输入视为错误,而不仅仅是跳过额外的字符。
一个稍微简单的选择是改用scanf
,但前提是您不想在每个变量的输入中允许空格:
int count;
scanf("%9s%n", A, &count);
if (count == 9) {
do {} while (!isspace(getc(stdin)));
}
scanf("%14s", B);
printf("A: %s; B: %sn", A, B);
这个C函数读取任意长度的行,并在新分配的内存块中返回指向它的指针(记住free()
它)。如果keepNL
为 true,并且换行符(即不是 EOF)停止读取,则它包含在字符串的末尾。如果len
不是 NULL
,则*len
设置为行的长度,包括任何换行符。它可以读取带有' '
的行,这是strlen()
无法处理的。
失败时,将返回NULL
,*len
保持不变。如果feof()
为 true,则在读取任何字符之前已达到 EOF(文件中没有更多行)。如果ferror()
为 true,则发生 I/O 错误。如果feof()
和ferror()
都不是真的,那么记忆就用尽了。
请注意,内存块可能大于字符串的长度。如果您需要节省内存,请自行realloc()
以*len + 1U
。
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#define MIN_LINE_BUF ((size_t) 128U) /* >= 1 */
char *fgetline(size_t *len, FILE *stream, int keepNL) {
char *buf;
int c;
size_t i, size;
if (!(buf = malloc(size = MIN_LINE_BUF))) {
return NULL;
}
i = 0U;
while ((c = getc(stream)) != EOF) {
if (c != 'n' || keepNL) {
buf[i++] = (char) c;
if (i == size) {
char *newPtr;
if (size > (size_t) -1 - size
|| !(newPtr = realloc(buf, size <<= 1))) {
free(buf);
return NULL;
}
buf = newPtr;
}
}
if (c == 'n') {
break;
}
}
if ((c == EOF && i == 0U) || ferror(stream)) {
free(buf);
return NULL;
}
buf[i++] = ' ';
if (len) {
*len = i;
}
return buf;
}