在向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()函数将在字母 的末尾放置换行符,但是为什么这些字符仍然出现?
答案 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
的第一部分将被赋值,即H
,e
,...,!
,\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;