2016-02-29 84 views
-2

我剛剛學習C後,學習Java和我有一個艱難的時間... 這個程序應該是一個簡單的命令提示程序,採取像「總和1 2 「並添加輸出」3「。程序將空間輸入標記爲2d數組。所以第一個元素將有命令,下面的整數將用於算術。只要我鍵入「總和1 2」,我得到一個分段錯誤錯誤,程序崩潰。學習C,分段錯誤

我將我的2d數組中的每一行設置爲「NULL」,以便我可以知道何時停止迭代遍歷行。我到處尋找,我想知道這是否是一種不正確的做法,以及是否有更有效的方法。

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

#define tLength 20 
#define tRow 7 
char input[tLength]; 
char tokens[tRow][tLength]; 
char p[tLength]; 
char y[tLength]; 
int counter = 0; 

void getTokens(char inp[]) { 
    strcpy(y, inp); 
     strcpy(p, strtok(y," ")); 
    strcpy(tokens[counter], p); 
     counter = 1; 
    while (p!=NULL){ 
      strcpy(p,strtok(NULL, " ")); 
     if (counter < tRow) { 
      strcpy(tokens[counter], p); 
         counter++; 
     } 
     else { 
      printf("Cannot process more lines"); 
         counter = 0; 
         break; 
     } 
    } 
     counter = 0; 
} 

void commandLine() { 
    int count; 
    for (count=0;count<tRow;count++){ 
     strcpy(tokens[count],"NULL"); 
    } 
    printf(">"); 
    fgets(input, tLength, stdin); 
    getTokens(input); 

    if (strcmp("quit", tokens[0]) == 0 || strcmp("Quit", tokens[0]) == 0) { 
     printf("Bye!"); 
    } 

    else if (strcmp("sum", tokens[0]) == 0 || strcmp("Sum", tokens[0]) == 0) { 
     int sum = 0; 
     counter = 1; 
     while (strcmp("NULL",tokens[counter])!=0) { 
      sum += atoi(tokens[counter]); 
      counter++; 
     } 
     counter = 0; 
     printf("%d", sum); 
    } 

    else if (strcmp("prod", tokens[0]) == 0 || strcmp("Prod", tokens[0]) == 0) { 
     int temp = 0; 
     int prod = 1; 
     counter = 1; 
     if (atoi(tokens[1]) == 0) { 
      printf("%d", 0); 
     } 
     else { 
      while (strcmp("NULL",tokens[counter])!=0) { 
       prod *= atoi(tokens[counter]); 
       counter++; 
      } 
     } 
     printf("%d", prod); 
    } 

    else { 
     printf("Error, unknown command"); 
    } 
} 

void main(void) { 
    commandLine(); 
} 
+0

首先,做'INT主要(無效)'代替 – Magisch

+0

'的strtok(NULL,「「)''成爲NULL'。另外'p!= NULL':'p'永遠不會變成'NULL'。 – BLUEPIXY

+1

'strtok(NULL,「」)'可能返回NULL,並將它傳遞給'strcpy()'調用*未定義的行爲*。 – MikeCAT

回答

0

幾個小竅門:

  1. 全局變量時不必要的,是壞
  2. 使用大寫字母宏
  3. 更好的初始化變量,比未初始化
  4. 使用描述性的變量名(不,P, y等)
  5. 空字符串不能與「NULL」進行比較
  6. POSIX提供了不區分大小寫的strcasecmp略去版本的strcmp
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAXINPUTLEN 20 
#define MAXTOKENS 7 

void getTokens(char* input, char tokenized[][MAXINPUTLEN]) 
{ 
    int counter = 0; 
    char* token = strtok(input, " "); 

    while(token != NULL) 
    { 
     if(counter < MAXTOKENS) 
     { 
      strncpy(tokenized[counter], token, MAXINPUTLEN); 
      counter++; 
     } 
     else 
     { 
      printf("Cannot process more lines"); 
      counter = 0; 
      break; 
     } 

     token = strtok(NULL, " "); 
    } 

    counter = 0; 
} 

void commandLine() 
{ 
    char input[MAXINPUTLEN] = {0}; 
    printf(">"); 
    fgets(input, MAXINPUTLEN, stdin); 
    char tokens[MAXTOKENS][MAXINPUTLEN] = {{0}}; 
    getTokens(input, tokens); 

    if(strcasecmp("quit", tokens[0]) == 0) 
    { 
     printf("Bye!"); 
    } 
    else if(strcasecmp("sum", tokens[0]) == 0) 
    { 
     int sum = 0; 

     for(int i = 1; tokens[i][0] != 0; ++i) 
     { 
      sum += atoi(tokens[i]); 
     } 

     printf("%d", sum); 
    } 
    else if(strcasecmp("prod", tokens[0]) == 0) 
    { 
     int prod = 1; 

     for(int i = 1; tokens[i][0] != 0; ++i) 
     { 
      prod *= atoi(tokens[i]); 
     } 

     printf("%d", prod); 
    } 
    else 
    { 
     printf("Error, unknown command"); 
    } 
} 

int main(void) 
{ 
    commandLine(); 

    return 0; 
} 
0

C中的數組的工作方式與Java中的不同。在C中,數組是基本類型。您不能將NULL分配給C中的數組。

在Java中,數組是對象引用;您需要創建一個數組對象並將其分配給數組變量。

事實上,Java數組更像是C指針。

您的代碼過度使用全局變量,並在您到達最後一個標記時嘗試在NULL指針上調用strcpy

您應該使用指針從strtok獲取返回值:

/* Returns the number of tokens captured. */ 
int getTokens(char inp[]) { 
    char *p; 
    int counter = 0; 
    strcpy(y, inp); 
    p = strtok(y," "); 
    while (p!=NULL){ 
     if (counter < tRow) { 
      strcpy(tokens[counter], p); 
      counter++; 
     } 
     else { 
      printf("Cannot process more lines"); 
      counter = 0; 
      break; 
     } 
    } 
    return counter; 
} 

注:有可能在代碼中更多的錯誤。我從來沒有通過getTokens

+0

難道你不能分配一個字符串值的char數組,說「NULL」,但?另外,p!= NULL是否阻止NULL上的strcpy? – codinginprogress

+0

數組'char p [20]'永遠不可能有'p == NULL'的值,這就是我將其改爲指針的原因。 –