【问题标题】:Printing array elements gives wrong output打印数组元素会给出错误的输出
【发布时间】:2015-12-02 10:46:20
【问题描述】:

我正在尝试根据用户输入打印由数字和美元符号组成的模式。我要求用户为模式选择一个选项,然后询问模式的大小。我使用交换来创建模式,所以如果用户选择选项 1,然后输入 4 的大小,他们应该会得到类似:

4$$$ $4$$ $$4$ $$$4。

现在我只是想让patternOne(0 工作。我无法打印出我在 patternOne() 函数中创建的数组元素。这是我的代码:

#include <stdio.h>

int main(void) {

    int option, size;
    do {
        printf("\nMENU\n");
        printf("1. Pattern one\n"
               "2. Pattern two\n"
               "3. Pattern three\n"
               "4. Pattern four\n"
               "5. Quit\n");
        fflush(stdout);

        do {
            printf("Please enter your choice (between 1 & 5): ");
            fflush(stdout);
            scanf("%d", &option);
        }while(option < 1 || option > 5);

        switch(option) {
            case 1:
                do {
                    printf("Choose a pattern size (between 2 & 9): \n");
                    fflush(stdout);
                    scanf("%d", &size);
                }while(size < 2 || size > 9);
                patternOne(size);
                break;

            case 2:
                printf("Testing case 2.");
                break;

            case 3:
                printf("Still testing.");
                break;

            case 4:
                printf("Testing case 4.");
                break;

            case 5:
                printf("Thank you for playing.\n");
                break;
        }

    }while(option != 5);

    return 0;

}

void patternOne(int size) {
    char ar[size];
    ar[0] = size;
    for(int i = 1; i < size - 1; i++) {
        ar[i] = '$';
    }
    int x = 0, y = 1, temp, iter = 0;
    while(iter <= size) {
        for(int j = 0; j < size - 1; j++)
        {
            printf(j);
        }
        temp = ar[x];
        ar[x] = ar[y];
        ar[y] = temp;
        x++;
        y++;
        iter++;
    }
}

【问题讨论】:

  • 打开编译器警告。您应该关注此代码中的几项,最值得注意的是在您的patternOne 函数中错误执行的printf,您没有为此提供格式字符串。

标签: c arrays loops printf


【解决方案1】:

首先,您的函数patternOne() 需要有一个forward declaration,否则,您将遇到隐式定义问题。

然后,在您的 patternOne() 代码中,

 printf(j);

至少应该是

printf("%d", j);

否则,您将向printf() 传递一个无效类型的参数并调用undefined behaviour

FWIW,您可以使用以下算法简化 patternOne() 函数的逻辑

  1. 创建char 数组
  2. mem 设置为$
  3. 运行一个循环,从0 迭代到n-1,设置n 值。
  4. 继续 2,直到循环用完

【讨论】:

    【解决方案2】:

    希望这是你想要的,我按照 Sourav Ghosh 的建议修改了代码,

    用这个替换你的模式一功能,

    void patternOne(int size) {
        char ar[size];
        memset (ar, '$', size);
    
        for (int h=0; h<size; h++){
            for(int i=0; i<size; i++) {
                if(h==i)
                    printf("%d",size);
                else
                    printf("%c",ar[i]);
            }
            printf(" ");
        }
    }
    

    这是我得到的输出

    [

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多