使字符串解析循环正常工作



我正在开发我的第一个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: %sn",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__而不仅仅是一个char(我必须翻译它们,因为我的 Ubuntu 用德语与我交谈)。激活我编译的程序会抛出一个Memoryaccess error,然后程序返回代码139这似乎意味着违反分段。

非常适合第一个程序;)首先,我编写一个程序,它可以做你想要的,然后我会进一步解释它。

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 ] = '' ;
        strcat( val , char_str ) ; 
        printf( "v:%s;n" , val ) ; 
    }
    printf( "expression: %sn" , 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 ] = '' ;

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

最新更新