我编写了一个c程序,该程序通过*input
作为参数传递,并且应该充当外壳程序。因此,我需要将输入拆分为我打算在char * tokens
中进行操作的字符串数组。但是,例如token + 2似乎没有引用我想要保存在数组第二个位置的整个String。您能帮助我如何进行更改吗?谢谢!
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int parse(char *input)
{
char * tokens = (char *) malloc(1024);
//Zaehler, an welcher aktuellen Stelle im Array tokens das Token ist
int zaehlertokens=0;
//zaehler der Stelle im Array input:
int zaehler=0;
//Zaehler, welche Stelle im Array input die erste nach einem Leerzeichen war:
int lastspace=0;
while(input[zaehler]!='\0')
{
//Input durchlaufen und bei Leerzeichen in Elemente aufteilen:
if(input[zaehler]==' ')
{
//Alle Buchstaben seit letzem Leerzeichen als neuen Eintrag in tokens speichern:
strncpy (tokens+zaehlertokens, input+lastspace, zaehler-lastspace-1);
zaehlertokens++;
lastspace=zaehler;
//damit umgehen, dass mehrere Leerzeichen nacheinander kommen:
while(input[zaehler]==' ')
{
zaehler++;
lastspace++;
printf("Leerzeichen. Zaehler: %i, Lastspace: %i\n", zaehler, lastspace);
}
}
//Zeiger auf das naechste Element im input Array
zaehler++;
}
//Wenn \0 aufgetreten ist, muss das letzte Elemente noch als token gespeichert werden:
if(input[zaehler]=='\0')
{
//Alle Buchstaben seit letzem Leerzeichen als neuen Eintrag in tokens speichern:
strncpy (tokens+zaehlertokens, input+lastspace, zaehler-lastspace-1);
zaehlertokens++;
lastspace=zaehler;
}
int zaehlerAusgabe=0;
///Schleife, die die Befehle nacheinander ausgibt
printf("Vor Ausgabe. Zaehlertokens: %i\n", zaehlertokens);
while(zaehlerAusgabe<zaehlertokens)
{
//row number:token
printf("%i: %s\n", zaehlerAusgabe, tokens+zaehlerAusgabe, sizeof(zaehlerAusgabe)+1+sizeof(tokens+zaehlerAusgabe));
fflush(stdout);
zaehlerAusgabe++;
//Ueberpruefen, ob exit eingegeben wurde:
printf("Comparison with exit, %s\n", tokens+zaehlerAusgabe-2 /*-1?*/);
if(strcmp(tokens+zaehlerAusgabe-1, "exit")==0)
{
printf("exit\n");
exiteingegeben=1;
}
}
return exiteingegeben;
}
答案 0 :(得分:1)
对于字符串数组,您需要2D数组。最初,您可以将其分配给已知数量的令牌,如果需要,可以分配realloc
。
char ** tokens = malloc(noTokens * sizeof(char*));
然后,您需要为每个令牌分配内存。
// Replace below line with
// strncpy (tokens+zaehlertokens, input+lastspace, zaehler-lastspace-1);
tokens[zaehlertokens] = malloc(zaehler + 1);
strncpy (tokens[zaehlertokens], input+lastspace, zaehler-lastspace-1);
tokens[zaehlertokens][zaehler] = '\0'; // null termination
如果最初分配的内存不足,则可以重新分配
if (zaehlertokens >= noTokens)
{
noTokens *= 2;
char ** tokens = realloc(noTokens * sizeof(char*));
}