首页 > 解决方案 > 如何打印字符串 num?

问题描述

问题:如何打印字符串 num?似乎最终语句无法执行?问题描述:请注意,数字 123456789 是一个 9 位数字,完全由 1 到 9 的数字组成,没有重复。将其加倍,我们将获得 246913578,它恰好是另一个 9 位数字,恰好包含从 1 到 9 的数字,只是排列不同。如果我们再次将其翻倍,请检查结果!现在你应该检查这个属性是否有更多的数字。也就是说,将给定数字加倍为 k 位,您要判断结果数字是否仅由原始数字中的数字排列组成。

/* Have Fun with Numbers */
#include <stdio.h>
#include <string.h>

int book[10] = { 0 };
int main(int argc, char* argv[])
{
    char num[22];
    int temp = 0;
    scanf_s("%s", num, 1);
    // Length of numbers
    int len = strlen(num);
    int flag = 0;
    for (int i = len - 1; i >= 0; --i) {
        // Convert an ASCII value of a digit into an integer
        temp = num[i] - '0';
        // Add 1 each time read a digit
        ++book[temp];
        temp = temp * 2 + flag;
        flag = 0;
        if (temp >= 10) {
            temp -= 10;
            flag = 1;
        }
        // Convert an integer into an ASCII value of a digit
        num[i] = (temp + '0');
        // Subtract 1 each time generate a digit
        --book[temp];
    }
    int flag1 = 0;
    for (int i = 0; i < 10; ++i) {
        if (book[i] != 0) {
            flag1 = 1;
        }
    }
    printf("%s", (flag == 1 || flag1 == 1) ? "No\n" : "Yes\n");
    if (flag == 1) {
        printf("1");
    }
    printf("%s", num);
    return 0;

}

标签: cvisual-studio

解决方案


在这个像

    scanf_s("%s", num, 1);

您将缓冲区大小报告为 1,scanf_s()而实际大小为 22。

使用正确的缓冲区大小。

    scanf_s("%s", num, 22);

或者

    scanf_s("%s", num, (unsigned)(sizeof(num) / sizeof(*num)));

推荐阅读