我目前正在尝试解决CodeChef中的问题,但我在循环中使用fgets()时遇到了麻烦。
第一个输入(T)将是一个包含用户输入数量的正整数
然后由换行符分隔,用户将在任何情况下输入长度为10的字符串。
所以,我试过这个:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int main()
{
int T;
int diffX, diffY;
char s[SIZE];
scanf("%d", &T);
while (T--){
fgets(s, SIZE, stdin);
printf("%s\n", s);
}
return 0;
}
但是,当我尝试使用以下输入测试代码时:
3
你好嗨嗨什么
我只能输入直到“Hi”然后程序退出成功(返回0)。
为什么会这样,我该如何解决?
提前谢谢你,
kpark。
答案 0 :(得分:5)
fgets()
会消耗第一次调用scanf()
时留下的换行符。所以它消耗了3行,但第一行看起来像是你所拥有的fgets()
循环的空行。
您可以使用fgets()
来获取第一行,并使用sscanf()
将字符串解析为数字来解决此问题。
fgets(s, SIZE, stdin);
sscanf(s, "%d", &T);
/* ... */
答案 1 :(得分:0)
计算T的读数是计数的一部分。在scanf中添加换行符。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int main()
{
int T;
int diffX, diffY;
char s[SIZE];
scanf("%d\n", &T);
while (T--){
fgets(s, SIZE, stdin);
printf("%s\n", s);
}
return 0;
}
答案 2 :(得分:0)
您的问题是关于如何阅读C中的多个字符串? 那么它可以通过两种方式完成: - 1.声明二维数组字符。
//Let say we want 6 strings each of them having max 10 characters.
char set[6][10] ;
for(int i=0;i<6;i++)
scanf("%s",set[i])
2.声明一维指向字符的指针数组(注意命名约定),其中每个指针都指向一个字符串。
int main(){
int i,numOfStrings;
char temp[30];
printf("Enter Number of strings in set ");
scanf("%d",&numOfStrings);
//Here We have defined array of pointer that will store each string sepratly.
//Arry of pointer to character.
char *setOfStrings[numOfStrings];
for(i=0;i<numOfStrings;i++)
{
printf("Enter string ");
scanf("%s",temp);
setOfStrings[i]= (char*)malloc(sizeof(temp)); //allocted new memory and gave it to array of pointer
strcpy(setOfStrings[i],temp);
}
for(i=0;i<numOfStrings;i++)
{
printf("string = %s \n",setOfStrings[i]);
}
return 0;
}
但需要了解: 对于指针数组,我们可以使用String初始化它们,但不能从命令行作为输入
char *set[2]={"Dinesh","Kandpal"}; //Its valid but you can't do this from command line
为此我们做什么我们将动态创建一个空间,s 在一维指针数组中的一个元素中撕掉该地址,然后我们扫描的任何值将该内容复制到另一个字符串到我们使用malloc创建的位置