【问题标题】:typedef: When I put a strings into the structure, top variable contains bottom variables' strings in Ctypedef:当我将字符串放入结构中时,顶部变量包含 C 中底部变量的字符串
【发布时间】:2020-11-06 01:34:40
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef struct{
    char a[10];
    char b[1];
    char c[5];
    char d[8];
}T_TEMP_C;

int main()
{
    char* temp = "123456789012345678901234";
    T_TEMP_C* ltpa = (T_TEMP_C*) temp;


    printf("ltpa -> a : %s\n", ltpa->a);
    printf("ltpa -> b : %c\n", ltpa->b[0]);
    printf("ltpa -> c : %s\n", ltpa->c);
    printf("ltpa -> d : %s\n", ltpa->d);

    return 0;
}

结果

    ltpa -> a : 123456789012345678901234                                                                                                                                               
    ltpa -> b : 1                                                                                                                                                                      
    ltpa -> c : 2345678901234                                                                                                                                                          
    ltpa -> d : 78901234

我不明白为什么会这样。

为什么 char a 包含整个字符串,即使 a 的大小只有 10。

我想将 1234567890 包含到一个 1 到 b,23456 到 c,其余到 d

【问题讨论】:

    标签: c typedef


    【解决方案1】:

    %s 格式化打印字符串,直到它到达一个空终止符。 temp 中唯一的终止符在最后,而不是在每个子字符串之后。如果你想让它工作,你需要在适当的地方嵌入空字节,并增加结构中的数组大小以适应它们。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    typedef struct{
        char a[11];
        char b[1];
        char c[6];
        char d[9];
    }T_TEMP_C;
    
    int main()
    {
        char* temp = "1234567890\0123456\078901234";
        T_TEMP_C* ltpa = (T_TEMP_C*) temp;
    
        printf("ltpa -> a : %s\n", ltpa->a);
        printf("ltpa -> b : %c\n", ltpa->b[0]);
        printf("ltpa -> c : %s\n", ltpa->c);
        printf("ltpa -> d : %s\n", ltpa->d);
    
        return 0;
    }
    

    但是,我什至不确定您的类型双关语是否真的可以正常工作。允许实现在结构成员之间添加填充,因此不能保证b 将在a 之后立即开始。

    如果您不想更改temp,则不能使用%s 格式打印子字符串。您可以在格式字符串中指定精度,然后它只会打印字符串的那么多字节。 %.10s 将打印最多 10 个字节,而不是直到空终止符为止。

        printf("ltpa -> a : %.10s\n", ltpa->a);
        printf("ltpa -> b : %c\n", ltpa->b[0]);
        printf("ltpa -> c : %.5s\n", ltpa->c);
        printf("ltpa -> d : %s\n", ltpa->d);
    

    【讨论】:

    • 我不想改变“temp”
    • @JaceCho,虽然这可能不是您希望的答案,但您的原始帖子表示您不明白为什么您的程序会如此行事。这确实回答了你的问题。
    • @JaceCho 我已经修改了答案,以显示如何指定要在格式字符串中打印的字节数。
    【解决方案2】:

    我建议不要将 char 指针转换为 struct 指针。

    要实现您的目标,您可以使用snprintf。即,

    const char* temp = "123456789012345678901234";
    T_TEMP_C thing;
    
    snprintf(thing.a,sizeof(thing.a), "%.*s", 10, temp);
    snprintf(thing.b,sizeof(thing.b), "%.*s", 1, temp+10);
    snprintf(thing.c,sizeof(thing.c), "%.*s", 5, temp+11);
    snprintf(thing.d,sizeof(thing.d), "%s", temp+16);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 2011-04-11
      • 2022-11-27
      • 2016-08-29
      相关资源
      最近更新 更多