【问题标题】:C language determine length of array depending on amount of digits entered by the userC语言根据用户输入的位数确定数组的长度
【发布时间】:2019-03-07 15:29:58
【问题描述】:

我有下面的代码,用户在其中输入他们的卡号,每个数字都存储为变量数组digits[] 中的一个元素。

我想要实现的是在 for 循环存储完所有数字后停止它,但是,我正在努力根据输入的卡号长度设置循环。

我已经尝试使用存储在可变长度中的sizeof(cardNo) 并将长度设置为循环条件的以下代码。

假设用户输入 1234,我在运行以下代码时收到的结果是 43210000,而我正在寻找的只是 4321。

如果我将 int digits 设置为 digits[4] 并将循环条件设置为

有什么想法或建议吗?

long cardNo = get_long("Enter Card Number: ");
int length = sizeof(cardNo);
int count = 0;
int digits[length];

for (int i = 0; i < length; i++) {
  digits[i] = cardNo % 10;
  cardNo /= 10;
  printf("%i\n", digits[i]);
} 
printf("\n");

【问题讨论】:

  • 分配最大值。同样,在本练习的每个问题中(大约有数百个问题),我建议使用数字的字符串表示而不是数值,除非有严格的要求。
  • 第一:使用malloc来动态分配内存。第二:length 应该是size_t 类型。我也认为cardNo 除非你想要负数句柄。
  • sizeof(cardNo) 不是你想的那样。
  • @IgorGalczak 不一定是size_t
  • @StaceyGirl 我写应该是因为:wiki.sei.cmu.edu/confluence/display/c/…

标签: c


【解决方案1】:

一个数的长度是以10为底的对数:

#include <math.h> //log10
....
    int len = log10(cardNo) + 1;
...

别忘了链接数学库 (gcc ... -lm)

【讨论】:

  • @Joshua:参数cardNo自动转换为double
  • @pmg 这似乎可以解决问题,谢谢。你能不能给我一个代码背后的快速解释?这样我就知道下次会发生什么了:)
  • 这就是对数的作用。 log10(x) 是你必须提高 10 才能获得 x 的数字。 10^3(幂,不是异或)是1000,所以log10(1000)是3;我添加1 得到4。log10(4863)3.&lt;something&gt;,它需要4 位数字。对整数的赋值会丢弃小数点后的任何内容。
  • @Coder: 999999999999999、9999999999999999、999999999999999999、99999999999999999 失败
  • 感谢@Joshua 的提醒。致 OP:您可能希望将输入限制在 getLong() 内。
【解决方案2】:

成语:measure-allocate-generate。

size_t n =0;
for (; i < cardno; ) {
  cardNo /= 10;
  n++;
} 
if(!n)n++;//0
int*digits=malloc(n*sizeof(int));

【讨论】:

  • sizeof(int) 不是一个好主意,修改可能会产生错误。
  • @Jose:在没有*sizeof() 的情况下调用malloc 是非常糟糕的主意,除非char
  • 我认为@Jose 的意思是int *digits = malloc(n * sizeof *digits); 将更容易避免在数字更改类型时出现错误(struct baseddigit *digits = malloc(n * sizeof (int)) /* error here */;)。 @Jose:请原谅我插嘴:)
  • 是的,正是@pmg。谢谢你的解释,肯定比我的好。
【解决方案3】:

考虑到最大数量的数字(开发人员选择将固定大小的容器存储在堆栈上,作为静态等),代码可能会更简单:

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

#define STRINGIFY(x) STRINGIFY2(x)
#define STRINGIFY2(x) #x

#define MAX_NUMBERS 16

int main() {
    char cardNum[MAX_NUMBERS + 1];
    size_t sizeCard;

    printf("Enter card numbers\n");
    scanf("%" STRINGIFY(MAX_NUMBERS) "s", cardNum);
    sizeCard = strlen(cardNum);
    for (int i = 0; i < sizeCard; i++) {
        printf("%c\n", cardNum[i]);
    }
    printf("\n");
}

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多