获取字符串解析循环

时间:2012-06-09 22:06:31

标签: c

我正在开发我的第一个C程序,它需要根据需要构造和解构字符串。不过,我不知道如何正确地做到这一点。有人可以解释一下吗?

就我而言,这是我的代码:

int main( int argc, char ** argv ) 
{ 
    if ( argc != 2 ) 
    { 
        _print_help(); /* defined above main() */ 
        exit(0); 
    } 

    char *s = argv[1]; 
    char *val = ""; 
    register int i; /* no idea why I need "register" and not just int */
    for(i=0;s[i];++i) /* loop over the string, take each character 
    {                    and add it to another string */
        strcat(val,s[i]); 
        printf("v:%s;\n",val); 
    } 
    printf("expression: %s\n",s); 
}

从make文件调用gcc(使用autotools生成):

gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT c-calc.o -MD -MP -MF .deps/c-calc.Tpo -c -o c-calc.o c-calc.c

现在它抛出警告,我不应该将一个整数作为strcat的第二个输入,而且string3.h需要const char * __restrict__而不仅仅是char(我必须翻译它们,因为我的Ubuntu用德语与我交谈。 激活我编译的程序会抛出Memoryaccess error然后程序返回代码139,这似乎意味着Segmentatation violation

1 个答案:

答案 0 :(得分:3)

非常适合第一个程序;)首先,我编写了一个能够完成你想要的程序,然后我会再解释一下。

int main( int argc, char ** argv ) 
{ 
    if ( argc != 2 ) 
    { 
        _print_help(); /* defined above main() */ 
        exit(0); 
    } 

    char *first_arg = argv[ 1 ] ;
    char val[ 1024 ]; //You should make enough memory to hold all the strings concatenated to each other. Here we suppose that 1024 is enough.

    strcpy( val , "" ) ; //Since val is an accumulator it should be initialized first.

    for( int i = 0 ; i < strlen( first_arg ) ; i++ ) /* loop over the string, take each character and add it to another string */
    {
        char char_str[ 2 ] ;
        char_str[ 0 ] = first_arg[ i ] ;
        char_str[ 1 ] = '\0' ;

        strcat( val , char_str ) ; 
        printf( "v:%s;\n" , val ) ; 
    }

    printf( "expression: %s\n" , val ) ; 
}

好的,让我们更好地解释一下。首先,你应该知道指针是什么。指针只是一个指向内存中某个位置的数字(通常是堆内存)。当你定义char *val时,它只不过是一个指针而且它后面没有任何东西。您必须使用以下命令对其进行初始化。

char val[ 1024 ] ;
char *val = new char[ 1024 ] ;

这些命令不同。实际上,第一个命令从堆栈中分配所需的内存(1024字节)。但前者从堆内存中获取1024个字节。前者不需要被释放,因为当你离开它的包含块时,它将被释放。但是第二个命令需要程序员使用以下命令手动释放:

delete [] val ;

关于这些内容:

char char_str[ 2 ] ;
char_str[ 0 ] = first_arg[ i ] ;
char_str[ 1 ] = '\0' ;

first_arg是一个指向argv[ 1 ]的指针,这意味着它们拥有相同的地址。字符与C / C ++中的字符串不同。 'A'"A"不同。 C / C ++中的所有字符串都应以'\0'字符结尾。 "A"可以被视为包含2个字符的字符串,第一个字符为'A',第二个字符为'\0' 。同样strcat()方法总是连接2个字符串,所以我必须构建一个字符串。一个带有2个单元格的角色,第一个是我想要的角色,下一个是'\0'个角色。现在我可以使用此字符串将其添加到val。