C 循环意外关闭

C 循环意外关闭,c,loops,C,Loops,我查过了,但没用- 所以,我是编程新手,我试图从SPOJ解决这个问题。我的怀疑是普遍的,因此没有在SPOJ论坛上发表。 我使用GCC在代码块中编写并运行了这段代码,它按预期运行,但在通过Ideone运行时运行方式不同 #include<stdio.h> #include<malloc.h> #include<string.h> int main() { int n,i,length,j; char **ptrarray; //creating

我查过了,但没用- 所以,我是编程新手,我试图从SPOJ解决这个问题。我的怀疑是普遍的,因此没有在SPOJ论坛上发表。 我使用GCC在代码块中编写并运行了这段代码,它按预期运行,但在通过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;
}
预期产出:

y
po
i
ntc
因此,当我在代码块中运行它时,我得到了预期的输出,但是当在ideone上运行它并在SPOJ上提交它时,printf循环只运行三次而不是四次,我得到的输出是:

y
po
i
我的问题是,为什么我没有在ideone中获得第四个ntc,为什么它没有被接受

编辑:将200字节更改为201字节,使用fscanf代替scanf,删除fflush并更新循环条件。 因此,如果我将循环条件从“更改为:

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);
这将分配ptrarray指向的任意大小的n倍,即sizeof char*,但不重复任何类型名称

这是一个非常普遍和更安全的模式,值得学习

如评论中所述,请勿使用fflushstdin;,这是未定义的行为。

这是:

毫无意义;您正在为n个整数分配空间,但通常会将结果分配给指向指针的指针,而指针的大小与整数的大小都不相同

分配应为:

ptrarray = malloc(n * sizeof *ptrarray);
这将分配ptrarray指向的任意大小的n倍,即sizeof char*,但不重复任何类型名称

这是一个非常普遍和更安全的模式,值得学习


如评论中所述,请勿使用fflushstdin;,这是未定义的行为。

调用fflushstdin;是未定义的行为。不要这样做。一个200个字符的字符串需要201个字符的存储空间,另外一个字符用于字符串终止符。@klaslindbaäck,Don;在这里我看不出任何错误:fgets一直读取,直到读取的字符数等于n-1,我被char**ptrarray弄糊涂了;vs ptrarray=int*mallocn*sizeofint.length=strlenptrary[i]-1//我敢肯定,这不是字符串的一半长度;是未定义的行为。不要这样做。一个200个字符的字符串需要201个字符的存储空间,另外一个字符用于字符串终止符。@klaslindbaäck,Don;在这里我看不出任何错误:fgets一直读取,直到读取的字符数等于n-1,我被char**ptrarray弄糊涂了;vs ptrarray=int*mallocn*sizeofint.length=strlenptrary[i]-1//字符串的一半我确信它不是字符串的一半。另外注意,ptrarray不是数组,应该用正确的名称重命名。@unwind sizeof*ptrarray相当于sizeof char*对吗?char*是指向字符的指针。因此它将保存一个无符号整数。根据这种逻辑,SizeOfFin不是与sizeofchar*相同吗?扩展sizeof*ptrarray?@NaishadhVora和char*是指向字符的指针。因此它将保存一个无符号整数。->否。指针大小和整型大小不相关。@chux I被赋予理解char*将保存字符地址的能力。这不是一个无符号整数的形式吗?对不起,这方面我还不太熟悉@NaishadhVora char*会保存一个字符的地址是的,这是真的。这不是一个无符号整数的形式吗?也许,也许不是——这是一个实现细节。更重要的是:代码不应该关心这一点。另外注意,ptraray不是数组,应该用正确的名称重命名。@unwind sizeof*ptraray相当于sizeof char*对吗?char*是指向字符的指针。因此它将保存一个无符号整数。根据这种逻辑,SizeOfFin不是与sizeofchar*相同吗?扩展sizeof*ptrarray?@NaishadhVora和char*是指向字符的指针。因此它将保存一个无符号整数。->否。指针大小和整型大小不相关。@chux I被赋予理解char*将保存字符地址的能力。这不是一个无符号整数的形式吗?对不起,这方面我还不太熟悉@NaishadhVora char*会保存一个字符的地址是的,这是真的。这不是一个无符号整数的形式吗?也许,也许不是——这是一个实现细节。更重要的是:代码不应该关心这一点。