这是我的代码:
char A[10];
char B[5];
cin >> setw(10) >> A;
cin >> setw(5) >> B;
cout << A;
cout << B;
如果输入超出数组大小(例如:A
变量为10),则程序不会提示我输入第二个数据。它直到最后并执行两个&#34; cout&#34;线。
输入:abcabcabcabcabcabc
(对于A)
输出:abcabcabcabca
(13个字符用于字符+ 2&#39; \ n&#39;)
预期输出:
abcabcabc
(对于A)
dddd
(对于B)
我想输入两个变量的数据,即使我为其中一个输入了太多字符
答案 0 :(得分:2)
在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);
我不认为有一种简单的方法(即不自己编码)允许多个分隔符。
答案 1 :(得分:1)
如果您想阅读具有固定限制的C字符串,最好的方法是使用fgets
,它是标准C ++库的一部分。
您还可以iomanip
使用setw
,如下所示:
char A[10];
char B[15];
cin >> setw(10) >> A;
cin >> setw(15) >> B;
请注意,您获取的字符串的长度将比您设置的宽度小1,因为C字符串需要空终止。
注意:虽然C和C ++的这种混合可行,但最好使用std::string
来获得更加惯用于C ++的方法。我认识到这可能是一种学习练习,但不允许你使用std::string
。
答案 2 :(得分:0)
在使用C ++时,您可以使用string
string A,B;
cin>>A>>B;
您可以在此处扫描任意数量的字符。
答案 3 :(得分:0)
如果你想坚持使用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: %s\n", 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: %s\n", A, B);
答案 4 :(得分:0)
此C函数读取任意长度的行,并在新分配的内存块中返回指向它的指针(记住free()
它)。如果keepNL
为真并且换行符(即非EOF)停止了读数,则将其包含在字符串的末尾。如果len
不是NULL
,则*len
设置为该行的长度,包括任何换行符。它可以读取'\0'
in的行,strlen()
无法处理。
失败时,会返回NULL
并且*len
不变。如果feof()
为真,则在读取任何字符之前达到EOF(文件中不再有行)。如果ferror()
为真,则发生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++] = '\0';
if (len) {
*len = i;
}
return buf;
}