为什么把整数赋值给字符串会导致空白?

7
我试着编写Fizz Buzz,但遇到了一个意外的交互。当我使用std :: cout << i时,它会自动将i(int)转换为字符串并打印出来?但是如果将i赋值给字符串变量,则会打印空白?我通过使用std :: to_string 解决了这个问题,但我想知道为什么打印to_print会打印空白而不是整数或抛出某种错误?
#include <iostream>
#include <string>

int main() {
    for (int i = 1; i <= 10; i++) {
        // prints i
        std::cout << i;
    }
    
    std::cout << std::endl;
    
    for (int i = 1; i <= 10; i++) {
        std::string to_print;
        to_print = i;
        // prints blank rather than i
        std::cout << to_print;
    }
}

1
哦,我真的很想知道为什么有一个接受CharT的赋值运算符,但没有做同样事情的构造函数。如果有任何问题,两者都应该有相同的问题。 - Yksisarvinen
@Yksisarvinen - 我想到的是简单重置的便利性。str = '\0'; - 尽管我承认这是一个相当脆弱的理由。 - StoryTeller - Unslander Monica
5个回答

12

没有string::operator=(int),但有string::operator=(char),被选为最佳可行候选。

因此,您正在将具有代码1..10的单个字符分配给字符串,显然由终端打印为空格。

尝试分配65,它应该打印A


根据设置,第7次迭代时,OP可能会听到蜂鸣声。 - phuclv

2

根据变量i的值和ASCII表,它会被转换为一个字符。前几个字符是不可见的。

将您的代码更改为从49开始迭代,这是字符"0"的十进制值:

for (int i = 49; i <= 57; i++) {
    std::string to_print;
    to_print = i;
    std::cout << to_print;
}

它会打印出:123456789


1
ASCII表是最可能的罪犯。您的“字符串”包含了不能打印的控制字符。
这是因为当您分配整数时,编译器将其视为字符。这是因为char可以被视为小整数。
根据asciitable.com,您的字符串包含换行符、响铃符、水平制表符等字符。

1
    for (int i = 1; i <= 10; i++) {
    // prints i
    std::cout << i;
    }

这里的std::cout知道它需要打印int,所以没有问题。
for (int i = 1; i <= 10; i++) {
    std::string to_print;
    to_print = i;
    // prints blank rather than i
    std::cout << to_print;
    }

这里将一个 int 放入 std::string 中, 这会把你的数字 (0, 1, 2 等) 转换成 char,因此是ASCII码。 尝试将 for 循环扩展到 255 而不是 10,你会看到其他字符。
像 @rustyx 所说的:

没有 string::operator=(int),但有 string::operator=(char), 它被选择为最佳可行候选。

你可以使用 to_string 将 int 转换为 std::string。

1
计算机中的数据以比特形式存储。当您尝试将整数变量值分配给char数据类型变量或String变量时,它会将该变量的内存内容读取为比特,并在打印时将其识别为字符串数据类型,因此它会查找Ascii值。而在整数打印的情况下,它将比特视为整数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接