【问题标题】:Outputs differing -- can't understand the logic输出不同 - 无法理解逻辑
【发布时间】:2018-03-13 13:57:03
【问题描述】:

基本上我正在创建一个包含一些值的数组“字符串”,创建另一个数组(“辅助字符串”),然后以相反的顺序存储初始数组的所有值。最后我把它们打印出来。

当我按原样执行程序时,为什么会得到垃圾作为输出?但是,如果我在“字符串”数组中放入另一个数字(即:{3,1,1,3,4}),它可以正常工作(输出:43113)。

如果我添加这一行,它也可以正常工作:

"printf("%d\n", sizeof(auxstring));"

就在 for 循环之前。

我确信这是非常基本的东西,但我想了解幕后发生的事情,以及为什么在初始字符串的末尾添加一个数字,或者放置那个 printf,以某种方式输出准确的数字。

谢谢。

#include <stdio.h>
#include <string.h>

int main(void) {

    int i=0, j, l; 
    char string[] = {3,1,1,3}; 
    char auxstring[sizeof(string)];

    for (j=(sizeof(auxstring) - 1); j >= auxstring[0]; j--) {

        auxstring[j] = string[i];
        i++; 
    }

for (l=0; l < sizeof(auxstring); l++) {
    printf("%d",auxstring[l]);
}



return 0;
}

【问题讨论】:

  • 条件应该是j&gt;=0而不是j &gt;= auxstring[0]
  • %d 需要整数,你给它一个字符(更少的字节)
  • @drilow char 将被提升为 int,所以没关系。
  • auxstringfor 循环的测试部分中使用未初始化。

标签: c arrays for-loop reverse sizeof


【解决方案1】:

for循环中的条件

for (j=(sizeof(auxstring) - 1); j >= auxstring[0]; j--) {
                                ^^^^^^^^^^^^^^^^^^

没有意义,因为至少数组 auxstring 没有被初始化。

循环也很复杂,因为它使用两个变量作为索引。

Ans 变量ijl 的类型应为size_t - 运算符sizeof 的返回值的类型。

程序可以如下所示

#include <stdio.h>

int main(void) 
{
    char string[] = { 1, 2, 3, 4 };
    char auxstring[sizeof( string )];
    const size_t N = sizeof( string );

    for ( size_t i = 0; i < N; i++ )
    {
        auxstring[i] = string[N - i - 1];
    }

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d", auxstring[i] );
    }

    return 0;
}

它的输出是

4321

【讨论】:

  • 感谢您对我的迟钝问题的简洁回答和优雅的解决方案。我实际上很好奇为什么在我的初始代码中的 for 循环之前添加那个 printf 会促使它按预期工作。知道幕后发生了什么吗?
  • @J.Rousselot 很抱歉我没有理解你的问题。
  • @J.Rousselot 似乎添加 printf 语句会强制编译器对数组进行零初始化。但是你不能依赖这个。
【解决方案2】:

循环条件应该是j &gt;= 0

现在您与auxstring[0] 中的未初始化 值进行比较,该值不确定(并且看起来是随机的)。

【讨论】:

  • 感谢您的快速帮助,解决了它。知道为什么:如果我添加以下行,它也可以正常工作:"printf("%d\n", sizeof(auxstring));"就在 for 循环之前。允许程序运行?
  • @J.Rousselot 我不知道。虽然使用不确定值不一定会导致undefined behavior,但您仍然不应该相信此类程序的行为。
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
相关资源
最近更新 更多