Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析c命令:char*,char**_C_Parsing_String Parsing - Fatal编程技术网

解析c命令:char*,char**

解析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

我读取了保存在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<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'.