字符数组 C++ 中的输入字符串

Input string in char array C++

本文关键字:输入 字符串 数组 C++ 字符      更新时间:2023-10-16

这是我的代码:

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++库的一部分。

你也可以使用 iomanipsetw ,像这样:

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;
}