我正在开发我的第一个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。
答案 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。