【问题标题】:Why do I get string of seemingly random number from this code?为什么我从这段代码中得到一串看似随机的数字?
【发布时间】:2016-09-24 21:58:04
【问题描述】:
#include <stdio.h>

#define LIM 1

int main(int argc, char const *argv[]) {
  int i;
  int c;
  char s[LIM];

  for (i=0; i < LIM-1 && (c=getchar()) != '\n' && c != EOF; ++i)
  {
    s[i] = c;
  }
  printf("%d\n", s);
  return 0;
}

输出例如:1541348039 我希望它是 1。

【问题讨论】:

  • %d 采用 int,而不是 char *
  • 你的循环永远不会执行。因此,您可以看到分配的内存中存储的任何内容。
  • #define LIM 1 太小 --> #define LIM 100 , char s[LIM] = {0}; 或在 for-loop 后添加 s[i] = 0; , printf("%d\n", s); --> printf("%s\n", s);

标签: c arrays for-loop


【解决方案1】:

printf("%d\n",*s) 或者 printf("%d\n",s[0])

现在你正在尝试打印 s 的地址。 s 是一个字符的数组,因此您需要指向要打印的元素。

编辑: 此外,您需要增加 LIM 的值,因为 for 中的条件始终为 false。

【讨论】:

    【解决方案2】:

    您的代码存在两个问题。第一个是你必须将代码中的条件i &lt; LIM-1更改为i &lt; LIM,否则循环将永远不会运行,因为LIM-1等于0,而i永远不会小于0。

    第二个问题是printf。如果您执行printf("%d\n", s);,那么您要求C 将s 打印为整数。在这种情况下,这将打印s 的内存地址。你想要的是

    printf("%c\n", s[0]);
    

    这将打印s 的唯一字符。请注意,您可能希望将 s 设为空终止字符串,在这种情况下,您可以使用以下命令打印所有字符串(不仅仅是第一个字符):

    printf("%s\n", s);
    

    当然,将s 设为空终止字符串需要增加其大小,因为空值需要一个额外的字符。此外,在这种情况下,您必须在循环中使用i &lt; LIM-1 条件为空字节留出空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      相关资源
      最近更新 更多