解析c命令:char*,char**
我读取了保存在char*中的c命令,因此基本上是一个逐字节的命令字符串 例如,回声a;回声b 假设我有char*wd=char*malloc20;,当我读取一个字节时,存储在wd[I]中 如果我看到'e',wd[0]='e',wd[1]='c',wd[2]='h',wd[3]='o',wd[4]='\0' 我设置set word[0]=wd 然后,再次重复为wd分配空间的循环。 设置wd[0]='a',wd[1]='\0',单词[1]=wd 我的代码如下所示:解析c命令:char*,char**,c,parsing,string-parsing,C,Parsing,String Parsing,我读取了保存在char*中的c命令,因此基本上是一个逐字节的命令字符串 例如,回声a;回声b 假设我有char*wd=char*malloc20;,当我读取一个字节时,存储在wd[I]中 如果我看到'e',wd[0]='e',wd[1]='c',wd[2]='h',wd[3]='o',wd[4]='\0' 我设置set word[0]=wd 然后,再次重复为wd分配空间的循环。 设置wd[0]='a',wd[1]='\0',单词[1]=wd 我的代码如下所示: for(i=0; i<str
for(i=0; i<strlen(input);i++)
{
if(validChar(input[i]))
{
printf("valid char:%c\n", input[i])
wd[k]=input[i];
k++;
cIndex++;
}
else if(input[i]==' ')
{
wd[cIndex]='\0';
printf("wd: %s\n",wd);
word[wIndex]=wd;
printf("word %d: %s\n", wIndex, word[wIndex]);
wIndex++;
....
}
}
问题是:
打印时,word0=a和word1=a也是如此
我很困惑,因为c没有字符串,我必须使用char*。
因此,当我复制字符串时,它不是复制内容,而是复制指针,因此它的值发生变化
如何修复此问题?您需要为每个单词分配新内存。您说您可以这样做,但在您的示例中没有代码
char *wd;
for(i=0; i<strlen(input);i++)
{
wd = malloc(20); // Added line. Allocate a chunk of memory for the next word
if(validChar(input[i]))
{
printf("valid char:%c\n", input[i])
wd[k]=input[i];
...
请注意,如果输入包含长度超过19字节的字,则此代码将遭受缓冲区溢出。通过strtok\r将示例分离到word,并通过strdup复制word 注:均为非标准功能
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void){
char input[256] = "echo a; echo b";
int word_max = 256;
char **word = malloc(word_max * sizeof(*word));
char *command_p, *com_sp;
int wIndex = 0;
command_p = strtok_r(input, ";\n", &com_sp);//separate by ";"
while(command_p){
char *wd, *wd_sp;
wd = strtok_r(command_p, " ", &wd_sp);
while(wd){
word[wIndex++] = strdup(wd);//make copy
if(wIndex == word_max){
word = realloc(word, (word_max += 8)*sizeof(*word));//check omitted
}
wd = strtok_r(NULL, " ", &wd_sp);
}
command_p = strtok_r(NULL, ";\n", &com_sp);
}
//print & relese
int i;
for(i=0; i < wIndex; ++i){
printf("word %d: %s\n", i, word[i]);
free(word[i]);
}
free(word);
return 0;
}
您可以包括一个字符串库:还包括,为了复制,您可以使用:strcpydestination,source;不要因为i=0而这样做;i@vivoconunxinoword是指针数组。我应该把它改成什么,这样它就不会打印wd的当前值?@iharob谢谢你指出strlen!已更改为输入[i]!='\0'.