相关疑难解决方法(0)

使用带有非null终止字符串的printf

假设你有一个未null终止的字符串并且你知道它的确切大小,那么如何printf在C中打印该字符串呢?我记得这样的方法,但现在我找不到...

c string format printf

97
推荐指数
4
解决办法
5万
查看次数

意外的 printf 输出

我刚刚发现 C 编译器有非常奇怪的行为。这是非常简单的代码。我在很多在线C编译器中尝试过,但结果总是一样的,这让我抓狂。

#include <stdio.h>

int main()
{
    char Buffer[10] = "0123456789";
    char ID[5] = "abcde";
    printf("%s",ID);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

花点时间尝试预测函数的结果printf。如果你是像我一样的人,那么我认为最明显的解决方案是“abcde”,这是不正确的!但如果你以某种方式算出了“abcde0123456789”,那么你就在消耗电力来生活。

怎么、怎么可能?我只选择ID要打印的数组,那么为什么Buffer也用它打印呢?这没有道理。即使ID数组也不够大,无法容纳所有数据。我真的要失去理智了。

c printf c-strings undefined-behavior output

11
推荐指数
2
解决办法
1224
查看次数

当没有空终止符时,C如何识别字符数组的结尾?

由于一个C字符阵列需要一个空终止,下面的代码打印4个一个 S和一些乱码.

char y[4] = {'a', 'a', 'a', 'a'};
printf("y = %s\n", y);
Run Code Online (Sandbox Code Playgroud)

输出:

y = aaaa?
Run Code Online (Sandbox Code Playgroud)

但是,以下代码不会生成垃圾字符.

char y[4] = {'a', 'a', 'a', 'a'};
char z[4] = {'b', 'b', 'b'};

printf("y = %s\n", y); 
printf("z = %s\n", z);
Run Code Online (Sandbox Code Playgroud)

输出:

y = aaaa
z = bbb
Run Code Online (Sandbox Code Playgroud)

我知道第四个字符z是使用null终止符自动初始化的.我猜也是如此,yz在内存中彼此相邻分配.

但是,在这种情况下,C如何正确打印4 a而不是前者?它是否确定下一个字节已经分配给另一个变量,所以它应该再停止打印了?

c

-4
推荐指数
1
解决办法
192
查看次数

标签 统计

c ×3

printf ×2

c-strings ×1

format ×1

output ×1

string ×1

undefined-behavior ×1