在二维数组中存储字符串和字符(C)

时间:2014-10-16 11:22:53

标签: c arrays scanf fgets getchar

我正在尝试编写一个程序来模拟DFA。我需要做的是从用户那里获取一些输入并将其保存在两个独立的数组中(将其用作行和列),然后创建第三个数组(2d)作为第一个数组的值表两个阵列。

例如:array2 = {a,b} array1 = {q1,q2,q3} array [array1] [array2] =(TABLE BELOW)

  a   b 

========

Q1 | v1 v2

Q2 | v3 v4

Q3 | v5 v6

问题:

1)我无法在数组中保存字符串q1,q2,q3 ...

2)第二个数组值以某种方式覆盖第一个数组值,(可能是因为我使用与其计数器相同的变量?如果我更改第二个循环的计数器变量,则会给出分段错误

如果有人能指出我做错了哪一部分会很棒。

编辑:由于coolguy和jayesh的回答,分割问题得到了解决。我还有一个问题,那就是array1没有返回一个字符串,只返回字符,如果我输入q1,它只返回q。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

// Function declaration
void clearNewLines(void);


int main(int argc, char *argv[]){

    // Number of states and number of alphabets of DFA
    int numStates;
    int numAlphabets;

    // Array for name of alphabets, and name of states
    char nameOfAlphabets[numAlphabets]; 
    char nameOfStates[numStates];

    // Saving transition table
    char *transitionTable[numStates][numAlphabets];

    // Read numStates 
    printf("Enter the number of STATES:");
    scanf("%d",&numStates);

    // Flush STDIN
    clearNewLines();

    // Read the nameOfStates 
    int i;
    for(i=0;i<numStates;i++){   
        printf("Name of STATES:");
        fgets(&nameOfStates[i], 100,stdin);
    }// End of for-loop to read nameOfStates

    // Read numAlphabets
    printf("Enter the number of ALPHABETS: ");
    scanf("%d", &numAlphabets);

    // Flush STDIN
    clearNewLines();

    // Read name of alphabets

    for(i=0;i<numAlphabets;i++){

        printf("Name of ALPHABETS:");
        nameOfAlphabets[i] = getchar();

        // Flush STDIN 
        clearNewLines(); 

    }// End for-loop to read alphabets

    // Get the transitionTable[states][alphabets] 
    int row;
    for(row=0;row<numStates;row++){

        int col;
        for(col=0;col<numAlphabets;col++){

            printf("Enter Transition From %c to %c: ",nameOfStates[row],nameOfAlphabets[col]);
            printf("\n");
        }

    }

    return 0;
}// End of main function

/*
*
*   clearNewLines - clear any newline character present at the STDIN
*/
void clearNewLines(void)
{
    int c;
    do
    {
        c = getchar();
    } while (c != '\n' && c != EOF);
}

2 个答案:

答案 0 :(得分:3)

int numStates;
int numAlphabets;

char nameOfAlphabets[numAlphabets]; 
char nameOfStates[numStates];
char *transitionTable[numStates][numAlphabets];

此处numAlphabetsnumStates未初始化。

scanf之后移动定义。

    int numStates;
    int numAlphabets;

  // Read numStates 
    printf("Enter the number of STATES:");
    scanf("%d",&numStates);

   // Read numAlphabets
    printf("Enter the number of ALPHABETS: ");
    scanf("%d", &numAlphabets);

    char nameOfAlphabets[numAlphabets]; 
    char nameOfStates[numStates];
    char *transitionTable[numStates][numAlphabets];

答案 1 :(得分:2)

 int numStates;
 int numAlphabets;
 char nameOfAlphabets[numAlphabets];
 char nameOfStates[numStates];  

在这里,您正在制作未初始化int的数组,这会导致分段错误。在相应的scanf之后移动数组初始化,以便在创建数组之前初始化两个int

char *transitionTable[numStates] [numAlphabets];

在两个scanf之后移动上面一行。