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

时间:2015-01-30 13:44:36

标签: c++ user-input

这是我的代码:

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)

我想输入两个变量的数据,即使我为其中一个输入了太多字符

5 个答案:

答案 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字符串需要空终止。

Demo.

注意:虽然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;
}