从C中的多行STDIN读取:分段错误或根本没有读取

时间:2014-03-06 01:45:39

标签: c arrays

我试图从stdin读取多行,其中偶数行是字符串,奇数行是用空格分隔的数字。我试图将数字读作整数,将字符串读作...字符串。这是学校项目的一部分,但并不是整个项目;我管理了其余的东西,但我无法实际从stdin中获取字符串和int。

当我是偶数时,我将每个名字添加到实验中(我尝试将其用作行号) 当我遇到一个空格时,我尝试使用malloc附加一个字符串n并将其存储为二维数组数据中的int,使用int a来浏览该行。

然后印刷部分只是试图表明它的工作原理而且它没有。我没有破坏任何阵列的长度,我觉得我看到了malloc,但我在这部分上花了超过15个小时,没有任何好处。我想知道是否有人可以给我一个提示。

 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
int main(int argc, char **argv) {
char *experiments[100];
int data[10][20];
char name[101];
int i=0;
int j=0;
char *n;
char *g;
fgets(name, 100, stdin);
while ((strstr(name,"*** END ***")!=0)&&(name!=NULL)){
    if((i%2)==0){
        experiments[i/2]=name;
        name[0]='\0';
    }
    else {
        int a = 0;
        while ((name[a]!='\n')&&(a<100)){
            if (name[a]!=' '){
                size_t len = strlen(n);
                g = malloc(len + 1 + 1);
                strcpy(g,n);
                g[strlen(n)-2] = name[a];
                g[strlen(n)-1] = '\0';
                n[0]='\0';
                *n = *g;
                free( g );
                a+=1;
            }
            else {
                data[j][i]=*n;
                j+=1;
                n[0]='\0';
                a+=1;

            }
        }
    }
    i+=1;
    fgets(name,100, stdin );
}
int k=0;
for(k=0;k<=i;k+=1){
    printf("printing\n");
    printf("%s\n", experiments[k]);
    if (experiments[k][0]=='\0') {
        printf("oh shoot!");
    }
    }

return(0);}

1 个答案:

答案 0 :(得分:0)

您似乎对以下内容存在根本混淆:

  • 你知道这句话吗?#34;给我六个小时的时间来砍伐一棵树,我会用前四个削尖斧头&#34;?这里有很多问题,而且它们可能是由钝斧造成的。无论你用什么书来学习C都无法教你。我推荐K&amp; R 2E。别忘了做练习。
  • 呸! forreturn都不是函数!对于对生活的热爱,如果您希望其他人阅读您的代码,请为他们呈现它!如果您的代码也一直缩进,那将会有所帮助。
  • 数组(例如,name!=NULL无法评估false,因此表达式毫无意义),指针以及experiments[i/2]=name;中从数组到指针的隐式转换。为了澄清,每次你这样分配时,不同的元素将指向同一个地方,当你下次调用fgets时,存储在那个地方的值将被覆盖。
  • malloc;你在错误的地方使用过它,你使用它的方式会重新激活自动存储持续时间(即你所有的变量)。你也可以根本不使用它。
  • fgets;它的失败模式会导致你的程序崩溃。
  • 字符串;见上文。

首先阅读K&amp; R 2E并按照前面提到的那样进行练习......一旦你完成了那本书,我认为你很有可能填补这个课程的空白:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    char *experiments[100] = { 0 };
    int data[10][20] = { 0 };
    char name[101] = { 0 };
    size_t i = 0, j = 0;
    fgets(name, sizeof name, stdin);
    while (strstr(name,"*** END ***") != 0){
        if(i%2 == 0){
            experiments[i / 2] = malloc(strlen(name) + 1);
            if (experiments[i / 2] == NULL) {
                puts("OOPS! malloc failure!");
                return 0;
            }
            strcpy(experiments[i / 2], name);
        }
        else {
            /* XXX: I have no idea what any of this was meant to do *
             * ...  but it was all HORRIBLY WRONG so I removed it.  *
             *      Try again once you've read K&R 2E and done the  *
             *      exercises...                                    */
        }
        i++;
        fgets(name, sizeof name, stdin);
    }

    for (size_t k = 0; k < i / 2; k++){
        puts("Printing...");
        puts(experiments[k]);
        if (experiments[k][0] == '\0') {
            puts("oh shoot!");
        }
        free(experiments[k]);
    }

    return 0;
}