我检查了这个,但没有帮助 - For loop scans one less time in c 所以,我是编程的新手,我试图从SPOJ解决这个问题(我的疑问是一般的,因此没有在SPOJ论坛上发布)。 http://www.spoj.com/problems/STRHH 我使用GCC在CodeBlocks中创建并运行此代码,它按预期运行,但在通过Ideone运行时运行方式不同。
#include<stdio.h>
#include<malloc.h>
#include<string.h>
int main()
{
int n,i,length,j;
char **ptrarray; //creating a pointer array that holds addresses of the strings
fscanf(stdin,"%d",&n);
ptrarray = (int *)malloc(n*sizeof(int)); //dynamically allocating memory for 'n' strings and storing their addresses in 'ptrarray'
for (i=0;i<=n;i++)
ptrarray[i] = (char *)malloc(201); //dynamically allocating memory for the strings
for (i=0;i<=n;i++)
fgets(ptrarray[i],201,stdin); //receiving string
for (i=0;i<=n;i++)
{
length=strlen(ptrarray[i])-1; //string length
for (j=0;j<(length)/2;j+=2) //obtain every other character up to half of the string length
printf("%c",ptrarray[i][j]);
printf("\n");
}
return 0;
}
输入:
4
your
progress
is
noticeable
预期产出:
y
po
i
ntc
所以,当我在Codeblocks中运行它时得到预期的输出但是当在ideone上运行它(并在SPOJ上提交它)时,printf循环只运行三次而不是4次,我得到的输出是:
y
po
i
我的问题是为什么我没有获得第四个“ntc”以及为什么它不被接受?
编辑:将“200”更改为“201”字节,使用fscanf而不是scanf,删除fflush并更新循环条件。 所以,如果我从'改变循环条件,我得到了所需的答案
答案 0 :(得分:4)
此:
char **ptrarray; //creating a pointer array that holds addresses of the strings
scanf("%d",&n);
ptrarray = (int *)malloc(n*sizeof(int)); //dynamically allocating memory for 'n' strings and storing their addresses in 'ptrarray'
没有意义;你为n
整数分配空间,但是将结果分配给指向指针的指针(通常都不是与整数相同的大小)。
分配应该是:
ptrarray = malloc(n * sizeof *ptrarray);
这将分配n
点的大小ptrarray
倍,即sizeof (char *)
,但不重复任何类型名称。
这是一种非常普遍且更安全的模式,值得学习。
正如评论中所提到的,不要fflush(stdin);
,这是未定义的行为。