我剛剛學習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();
}
首先,做'INT主要(無效)'代替 – Magisch
'的strtok(NULL,「「)''成爲NULL'。另外'p!= NULL':'p'永遠不會變成'NULL'。 – BLUEPIXY
'strtok(NULL,「」)'可能返回NULL,並將它傳遞給'strcpy()'調用*未定義的行爲*。 – MikeCAT