0

我正在开发我的第一个 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); 
}

gcc 从 make 文件中调用(使用 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__而不仅仅是 a char(我必须翻译它们,因为我的 Ubuntu 用德语与我交谈)。激活我编译的程序会抛出一个Memoryaccess error,然后程序返回139似乎意味着Segmentatation 违规的代码。

4

1 回答 1

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 中。

于 2012-06-09T22:32:39.310 回答