任何人都可以告诉我为什么这段代码不起作用?当我跑步时,它只是打印出来"输入关于小径1和#34的信息;没有任何输入,跳到另一步。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 15
void readingArrays(int numberOfTrails,char arr[MAX][20]);
char array[MAX][20];
int main(void)
{
int numberOfTrails;
printf("Enter the number of trails\n");
scanf("%d",&numberOfTrails);
readingArrays(numberOfTrails,array);
return 0;
}
void readingArrays(int numberOfTrails,char arr[numberOfTrails][20])
{
for(int i=0;i<numberOfTrails;i++)
{
printf("Enter info about trails %d\n",i+1);
fgets(arr[i],4,stdin);
//getchar();
//strtok(arr[i], "\n");
printf("%s\n",arr[i]);
}
}
答案 0 :(得分:2)
<强>问题强>
main中的scanf函数读取整数,但在输入流上留下换行符\n
。当readingArrays
的第一次循环迭代出现时,fgets
会看到此换行符并假设您已经输入了跟踪信息并按下回车键。它打印空字符串和换行符,然后继续下一次迭代。
<强>解决方案强>
一种解决方案是通过在%d格式说明符之后添加空格来告诉scanf
读取并忽略数字后面的空格。
所以要从stdin获取numberOfTrails
,你会做
scanf("%d ",&numberOfTrails);
感谢@Ray指出这个解决方案!
答案 1 :(得分:2)
perl语言为你提供了chomp,它从输入中读取的行中删除了换行符。我发现躺在身边很有用,
char*
chomp(char* p)
{
if(!p) return p;
size_t len=strlen(p);
//if(len<=0) return(p);
if(len>0) len--;
if(p[len]=='\n') p[len--]='\0';
if(len>=0) if(p[len]=='\r') p[len--]='\0';
return(p);
}
因此,声明一个用于读取一行的变量,然后使用gets来解析该行。负载更清晰。请注意,您的数组是一个MAX [@]数组的数组,您可能会输入更大的行。读取输入的整行,然后提取所需的部分
是有效的char array[MAX][20];
int ndx;
char line[100];
for( ndx=0; fgets(line,sizeof(line)-1),stdin); ++ndx ) {
chomp(line);
strncpy(array[ndx],line,sizeof(array[ndx])-1);
//combine both into one line:
//strncpy(array[ndx],chomp(line),sizeof(array[ndx])-1);
/*NULL termination of array[ndx] left as exercise for reader*/
}
答案 2 :(得分:0)
1)在scanf()之后添加这一行: 的getchar()
2)将fgets(...)改为4到19。
该计划将有效。