C ++ |执行此程序后,为什么会出现奇怪的字符?

时间:2018-08-26 17:12:55

标签: c++ arrays

在向myString输入一些字母后,我得到一个包含精确字母为myString的输出,其中包含一些奇怪的加扰字符。 例如,我键入“字母” ,而我得到的输出如下:

字母  ÷ìu(■(Bñìu¿☻÷u³■(ʶìÄ◄ÿub◄ÿu←öïÜÉpBº■(((─(î¯u Å{N´■b◄ÿu─[uÉpBö(¯pBÉpBP4åÇ

这个奇怪的字符在不同的输入下看起来也不同,但是在用相同的输入重建后它们不会改变。

这是我编写的代码:

#include <iostream>
using namespace std;
int main()
{
    constexpr int BUFFER_SIZE = 128;

    char myString[BUFFER_SIZE + 1] = {}; // + 1 for null. Initialize all with null.

    cout << "Enter a string: ";
    fgets(myString, BUFFER_SIZE, stdin);

    int myString_size = sizeof(myString);
    for (int i = 0; i < myString_size; i++) {
        cout << myString[i];
    }
    system("PAUSE");
    return 0;
}

现在,我知道fgets()函数将在字母 的末尾放置换行符,但是为什么这些字符仍然出现?

3 个答案:

答案 0 :(得分:3)

C字符串的长度与字符串开头和终止的空字符之间的字符数一样长(不包括终止的空字符本身)。要获取C字符串的长度,请使用:

size_t myString_size = strlen(myString);

然后,循环应类似于:

for (size_t i = 0; i < myString_size; i++) {
    cout << myString[i];
}

答案 1 :(得分:0)

您保留myString个字节的缓冲区128,该缓冲区在声明过程中未初始化(即,对于128个字节中的每个字节,它都可以包含任意值)。当输出到控制台时,这些任意值中的每一个都可能产生“奇怪的东西”。

当您输入一个字符串时,例如"Hello!",只有myString的第一部分将被赋值,即He,...,!\n\0。其他所有内容将保持fgets之前的状态,即它们可能仍包含“奇怪的内容”。

在循环中,您将打印所有128个字符,即奇怪的字符。顺便说一句:使用<=sizeof(myString),您将缓冲区末尾移至第1位并访问未保留的内存。

要解决此问题,请尝试以下操作:

int main()
{
    char myString[128];
    cout << "Enter a string: ";
    fgets(myString, 128, stdin);
    size_t myString_size = strlen(myString);
    for (size_t i= 0; i < myString_size; i++) {
        cout << myString[i];
    }
}

或者:

#include <string.h>
int main()
{
    char myString[128];
    cout << "Enter a string: ";
    fgets(myString, 128, stdin);
    cout << myString;
}

或者:

int main()
{
    char myString[128];
    cout << "Enter a string: ";
    fgets(myString, 128, stdin);
    size_t myString_size = strlen(myString);
    for (size_t i= 0; i < myString_size && myString[i] != '\0'; i++) {  // stop when reaching the end of the string
        cout << myString[i];
    }
}

答案 2 :(得分:0)

"prestart": "webpack --mode development --watch" 返回缓冲区sizeof(myString)的大小(以字节为单位),而不是字符串的大小。要遍历字符串的字符,可以使用如下循环:

char[128]

或强制转换为for (char *c = &myString[0]; *c != '\0' ; ++c) std::cout << c;

std::string

或更简单地说:

for (char c : std::string(myString))
     std::cout << c;