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