for(i = 0; i < n; i++)
{
gets(s[i]);
}
for(i = 0; i<n; i++)
{
if (s[i][0] > 91)
arr[i] = s[i][0] - 32;
else
arr[i] = s[i][0];
}
for(i = 0; i < n; i++)
printf("%d ",arr[i]);
我正在取名为arr的数组中n个字符串的每个第一个字母的ascii值。但是get仅运行(n-1)次,例如,如果n = 5,那么我应该可以使用gets获得5个字符串,但只能让我接受4个字符串。问题是第一个字符串。因为FIRST字符串的第一个字母的ascii值始终为0。例如,
input : n = 5
a
b
c
d \\ won't let me take another input
output :
0 65 66 67 68
现在我已经在堆栈上的其他问题的帮助下找到了解决方案。在出现以下情况之前添加getchar:
for(i = 0; i < n; i++)
{
getchar();
gets(s[i]);
}
然后就可以了。但是我不知道出什么问题了,为什么使用getchar可以解决这个问题。请告诉我这是怎么回事。
N.B.我知道使用获取很危险。但是我正在学习c,因此熟悉其他所有c函数。从其他堆栈问题来看,我认为gets的问题在于它无法读取'\ n',但是我的代码中根本没有'\ n'。
答案 0 :(得分:1)
该程序将fgets
用于所有输入,以解决由scanf leaving the newline in the input buffer引起的问题:
#include <stdio.h>
#include <stdlib.h>
int main() {
char input[81];
int count;
printf("input : n = ");
fgets(input, sizeof(input), stdin);
sscanf(input, "%d\n", &count);
int *array = calloc(count, sizeof(int));
for (int index = 0; index < count; index++) {
fgets(input, sizeof(input), stdin);
int digit = input[0];
if (digit > 91) {
array[index] = digit - 32;
}
else {
array[index] = digit;
}
}
for (int index = 0; index < count; index++) {
printf("%d ", array[index]);
}
printf("\n");
free(array);
return 0;
}
示例
[user@machine]: ./scratch
input : n = 5
a
b
c
d
e
65 66 67 68 69
注意
该程序不进行错误检查,并向int
传递size_t
而不是calloc
。此代码不应在生产环境中使用。