循环意外关闭

时间:2017-12-14 15:39:54

标签: c loops

我检查了这个,但没有帮助 - 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并更新循环条件。 所以,如果我从'改变循环条件,我得到了所需的答案

1 个答案:

答案 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);,这是未定义的行为。