【问题标题】:C user input getting skippedC 用户输入被跳过
【发布时间】:2021-11-29 17:32:06
【问题描述】:

我用 C 语言编写了一个代码,它利用了动态内存分配,但我的输入在第二次迭代之后被跳过了。

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

int main() {
    int n;
    printf("Enter the number of users :");
    scanf("%d", &n);
    // char **array = malloc(n * sizeof(char *));
    char flag[4];
    for(int i=0;i<n;i++) {
        printf("Does user have middle name? (yes/no) :");
        scanf("%s", flag);
        if (strcmp("yes", flag)==0) {
            char **array = malloc(3 * sizeof(char *));
            for(int j=0;j<3;j++)
                array[i] = (char *)malloc(9);
            printf("First name :");
            scanf("%s", array[0]);
            printf("Middle name :");
            scanf("%s", array[1]);
            printf("Last name :");
            scanf("%s", array[2]);
            for(int i=0;i<3;i++) 
                free(array[i]);
            free(array);
        }
        else {
            char **array = malloc(2 * sizeof(char *));
            for(int j=0;j<2;j++)
                array[i] = (char *)malloc(9);
            printf("First name :");
            scanf("%s", array[0]);
            printf("Last name :");
            scanf("%s", array[1]);
            for(int i=0;i<2;i++) 
                free(array[i]);
            free(array);
        }
    }

    
}

在这里,假设我给出 n=3 并输入“是”。它输入名字、中间名、姓氏,然后跳过下一个“它有中间名吗”。为什么会这样??

【问题讨论】:

  • edit您的问题显示您在运行时提供给程序的完整和完整的输入。
  • 我还建议您以此为契机,学习如何使用 调试器 在监视变量及其值的同时逐语句逐句执行代码,以了解真正的发生在代码中。
  • 在第一次迭代中输入名字和中间名后立即出现分段错误。这肯定会阻止它第二次出现。另外,您忘记包含 string.h 和 stdio.h。

标签: c memory input allocation


【解决方案1】:

问题出在这里:

for(int j=0;j<3;j++)
    array[i] = (char *)malloc(9);

你想使用索引j,而不是i

for(int j=0;j<3;j++)
    array[j] = malloc(9); // Don't cast malloc

您也在内部循环中隐藏i

for(int i=0;i<n;i++) {
    ...
    for(int i=0;i<3;i++)

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2012-03-15
    相关资源
    最近更新 更多