连接如何在C中工作?

时间:2014-10-08 13:35:10

标签: java c string concatenation

我目前正在学校学习C课程,在习惯了Java之后,我似乎不明白在C语言中是如何进行连接的。在Google中搜索并不像大多数代码那样有用我看到的是如何连接像"Hello" + "World"这样的实际字符串。

在Java中,我想在一行中连接一个算术表达式,我可以很容易地使用+运算符,但在C中,我唯一可以看到熟悉的东西是这样的:

int grade;
scanf("%d", &grade);

我可以理解grade变量被视为输入,但如果我想使用+&运算符对此变量执行算术运算,得到错误。这是我尝试做的一个例子:

printf("The average score is "& grade / 2 & "");

即使我使用+运算符也会返回错误,但在Java中运行良好:

System.out.println("The average score is " + grade / 2 + "");

我可以理解它们是不同的语言但不是+&运算符应该用于C中的连接吗?

5 个答案:

答案 0 :(得分:4)

没有。 +和&不是用于C中的连接。无论如何,在C中你通常会使用strncat来连接char *(s),但你的问题似乎与打印有关。为此,你应该做类似

的事情
printf("The average score is %d\n", grade / 2);

答案 1 :(得分:2)

在java +中,sign用于连接字符串,例如:

             System.out.println("hello"+","+" "+"World"); 

它只是一种显示字符串连接的粗略方法。这个原则在java中是可能的,因为+运算符用于数学运算,并且+被重载以连接字符串。

但是在C +中,符号应该只执行数学而不是重载以连接。

因此,在C上,打印输出的最佳方法是使用格式化的print语句:printf

printf("String <format specifier>",arg1,arg2,...);
有关Print语句的更多详细信息。 Click Here

答案 2 :(得分:2)

所以,你有两个问题伪装成一个问题。

C的格式化I / O例程(printffprintf)根本不像Java的I / O例程那样工作。您可以使用具有可变数据占位符的格式字符串,而不是将项目连接到字符串,然后将变量数据作为附加参数传递:

printf( "The average score is %d\n", grade/2 );

%d转换说明符;它告诉printf有一个额外的参数类型为int,它应该被格式化为一个数字序列。请注意,printf依赖于格式字符串中的转换说明符来告诉它需要多少以及哪些类型的附加参数;如果你传递的参数是给定转换说明符的错误类型,或者没有传递足够的参数,那么你将从乱码输出到彻底崩溃。如果传递的参数多于格式字符串所调用的参数,则会计算其他参数,否则将被忽略。

有关所有不同转换说明符及其使用方式的说明,请参阅您方便的C参考手册。

对于字符串连接,C没有字符串类型本身,也没有字符串连接运算符 1 。在C中,“字符串”是由0值字节终止的字符值序列。字符串存储char的数组,例如:

char h[] = "hello";
char w[] = "world";

数组h包含值{'h', 'e', 'l', 'l', 'o', 0}w包含{'w', 'o', 'r', 'l', 'd', 0}。要将字符串连接在一起,您需要预留一个足够大的目标缓冲区来容纳两个字符串。如果您的编译器支持可变长度数组,则可以执行以下操作:

char result[ strlen(h) + strlen(w) + 2 ]; 

否则你将不得不动态分配内存:

char *result = malloc( sizeof *result * (strlen(h) + strlen(w) + 2) );

“{1}”对于“hello”和“world”以及终止0字节之间的空格是必需的。

获得目标缓冲区后,您可以使用+ 2strcpy的组合来写入:

strcat

或者您可以使用strcpy( result, h ); strcat( result, " " ); // note " " instead of ' '; the second argument *must* be a string strcat( result, w ); (其工作方式类似于sprintf,但会将结果写入printf而不是流的数组中:

char

要使sprintf( result, "%s %s", h, w ); 起作用,目标缓冲区中必须已经有一个有效的,以0结尾的字符串,这就是为什么我们从strcat开始,它会在结尾附加一个0字节。复制的字符串。空字符串包含单个0值字节,因此我们也可以执行以下操作:

strcpy

result[0] = 0; // or memset( result, 0, sizeof result ), which sets the whole buffer to 0 strcat( result, h ); strcat( result, " " ); strcat( result, w ); 查找终止0字节,并用下一个字符串的开头覆盖它,然后在结果的末尾附加一个0字节。

<小时/> 1。彼此相邻的字符串文字在编译的预处理阶段连接在一起,因此您可以编写类似strcat的内容,并且在预处理之后它将看起来像`printf(“字符串的开头)字符串\ n“)的宏末端,但没有运行时连接运算符。

答案 3 :(得分:0)

在你的例子中

printf("The average score is "& grade / 2 & "");

&运算符用于获取任何变量的内存地址,因此当您尝试仅打印普通的int变量时,不需要&

你可以做这样的事情

printf("The average score is %d", ( grade/2 ));

printf中使用的%d用于匹配您提供的变量

答案 4 :(得分:0)

你有java的概念,但是所有语言的语法都不一样,所以我的建议是你先读C语言输入输出操作,在C语言&amp;用来获取变量的内存地址,所以你不能用它来控制两个字符串类型的工作,在java'+'中可以用来con-cat两个字符串它是高级语言,所以你可以做这个,但在c中是不可能的,%d用于c从内存中获取变量。 所以你的输出代码是:

`printf(“平均分为%d”,(等级)/ 2);