字符数组用户输入扫描

时间:2018-12-12 02:08:45

标签: c

刚开始自己​​学习编程,并尝试使用scanf从用户输入创建字符数组时遇到了麻烦;代码如下:

#include <stdio.h>
#define I 5

int main (void) {

    char a[I+1] = {a[I+1] = '\0'}, q;
    int i;

    for(i = 0; i < I; i++) {
        printf("Enter an alphabet:\t");
        //scanf("%c", &q);
        //scanf("%c*\n", &q);
        //scanf("%[^\n]", &q);
        //scanf("%[a-z, A-Z]", &q);
        scanf("%127[^\n]", &q);
        a[i] = q;
    }

    printf("\n");

    for(i = 0; i < I; i++)  {
        printf("Element a[%d] of a[I]:\t%c\n", i, a[i]);
    }

    printf("And the a[I] string:\t%s\n", a);

    return 0;
}

以上代码中的scanf组合都不起作用:该程序或者在第一个之后跳过输入提示,或者不存储响应。

如何用scanf解决这个问题?

2 个答案:

答案 0 :(得分:0)

char a[I+1] = {a[I+1] = '\0'}无效。即使它编译,在分配'\0'字符时也会超出范围。常用的约定看起来更像这样:

char a[I+1] = {0};

或者简单地:

char a[I+1] = {};

也就是说,q的大小仅为1 char,但是您的scanf()试图将最多127个char s的字符串读入q 。因此,您将浪费内存。要一次读取一个char,请改用%c

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

#define MAX_INPUT 5

int main (void) {

    char a[MAX_INPUT+1];
    int i, len;

    for(i = 0; i < MAX_INPUT; i++) {
        printf("Enter an alphabet:\t");
        scanf("%c", &a[i]);
    }
    a[MAX_INPUT] = '\0';

    printf("\n");

    len = strlen(a);
    for(i = 0; i < len; i++)  {
        printf("Element a[%d]:\t%c\n", i, a[i]);
    }

    printf("And the a string:\t%s\n", a);

    return 0;
}

或者,您可以删除循环,而只需使用scanf()作为格式字符串对"%5[^\n]"进行一次调用即可:

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

#define MAX_INPUT 5

int main (void) {

    char a[MAX_INPUT+1];
    char fmt[20];
    int i, len;

    sprintf(fmt, "%%%d[^\n]", MAX_INPUT);

    printf("Enter an alphabet:\t");
    scanf(fmt, a);

    printf("\n");

    len = strlen(a);
    for(i = 0; i < len; i++)  {
        printf("Element a[%d]:\t%c\n", i, a[i]);
    }

    printf("And the a string:\t%s\n", a);

    return 0;
}

答案 1 :(得分:-1)

这在带有Wall标志的Cygwin gcc v7.3上没有任何警告或错误的情况下起作用:

#include <stdio.h>
#define I 5

int main (void) {
    char a[I+1] = {a[I+1] = '\0'},q;
    int i;

    for(i = 0; i < I; i++) {
        printf("Enter an alphabet:\t");
        scanf("%c%*c", &q);
        a[i] = q;
    }

    printf("\n");

    for(i = 0; i < I; i++)  {
        printf("Element a[%d] of a[I]:\t%c\n", i, a[i]);
    }

    printf("And the string a[I]:\t%s\n", a);

    return 0;
}