【问题标题】:C : reversed array only prints when explicitly looped throughC:反转数组仅在显式循环时打印
【发布时间】:2020-12-21 21:04:10
【问题描述】:

我正在将数组的反转“保存”到新数组中。 示例:

数组 A = abc

数组 B = cba

以下代码是我的解决方案。除非显式循环,否则新的反向 array B 不会打印。单个元素上的 fprint %sfprint %c 都会打印空白。这是什么原因造成的?

注意:函数接受一个数字并首先转换为字符串。

int reverse(int x){
    int len = int_length(x); //Functions works, gets the length
    len++; //add room for \0
    char *num = (char *)malloc(len * sizeof(char));
    char *ans = (char *)malloc(len * sizeof(char));
    snprintf(num, len, "%d", x); //Turn the numbers into a char array
    printf("%s\n", num);
    
    int i;
    for(i = 0; i < len; i++) {
        ans[i] = num[len-(i+1)];
    }

    
    for(i = 0; i < len; i++) {
     printf("%c\n", ans[i]);  //PRINTS FINE
    }
    
    printf("\n%c\n", num[0]);
    printf("%c\n", ans[0]); //NOTHING PRINTS
    printf("%s\n", ans); //NOTHING PRINTS

    return 0;
}

【问题讨论】:

  • 请注意,您可以使用snprintf 来确定创建字符串所需的实际大小。
  • 最后,解决像您这样的问题的“标准”方法是使用 调试器 在监视变量及其值的同时逐句执行代码。
  • 你正在增加 len 来解释 nul 终止符,现在 nul 终止符在混合中,并且通过将它变为空来破坏你的反转字符串,除非你逐个字符地打印它
  • char *num = (char *)malloc(len * sizeof(char)); 应该是:char *num =malloc(len + 1); 对于 C 的转换是错误的(对于 ~C++), and sizeof(char)` 的定义总是 == 1。

标签: arrays c printf


【解决方案1】:
len++; //add room for \0
char *num = (char *)malloc(len * sizeof(char));
char *ans = (char *)malloc(len * sizeof(char));

将长度加 1 很好,但是 不要将该数字用作实际的字符串长度

如果不调试它,我的猜测是 nul 终止符在反转字符串的 start 处结束,当打印为字符串时使其为空(但当你强制所有字符时显示正常在放置不当的 nul 终止符之外打印)

不会更改len,然后在分配时显式加1:

char *num = malloc(len+1);
char *ans = malloc(len+1);

(当然要放弃通常的冗余:不要从 malloc 投射指针,不要乘以 sizeof(char),因为它总是 1)

【讨论】:

  • 这行得通,我也必须这样做:snprintf(num, len + 1, "%d", x);谢谢大家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多