刚开始自己学习编程,并尝试使用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解决这个问题?
答案 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;
}