AFunc更改发送给它的内容,printf()输出更改:
void AFunc ( char *myStr, int *myNum )
{
*myStr = 's';
*myNum = 9;
}
int main ( int argc, char *argv[] )
{
char someString = 'm';
int n = 6;
AFunc(&someString, &n);
printf("%c" "%d", someString, n);
}
但是如果字符串不止一个字符怎么办?代码看起来会有什么不同?谢谢你的帮助。
答案 0 :(得分:3)
如果是“字符串”而不是字符,你可以这样做:
#include <stdio.h>
void AFunc (char *myStr, int *myNum) {
myStr[0] = 'p'; // or replace the lot with strcpy(myStr, "pax");
myStr[1] = 'a';
myStr[2] = 'x';
myStr[3] = '\0';
*myNum = 9;
}
int main (void) {
char someString[4];
int n = 6;
AFunc(someString, &n);
printf("%s %d", someString, n);
return 0;
}
输出:
pax 9
C中的“字符串”实际上是由\0
(NUL)字符终止的字符数组。
上面代码的作用是传入该数组中第一个字符的地址,该函数从那里开始填充四个字符。
答案 1 :(得分:3)
在C中,指向char
的指针不一定是字符串。换句话说,仅仅因为你有char *x;
,这并不意味着x
是一个字符串。
要成为字符串,x
必须指向一个适当分配的区域,其中某处有0
。 x
指向0
的第一个字符的数据是一个字符串。以下是C中字符串的一些示例:
char x[5] = {0}; /* string of length 0 */
char x[] = "hello"; /* string of length 5, the array length being 6 */
char *x = "hello"; /* string of length 5. x is a pointer to a read-only buffer of 6 chars */
char *x = malloc(10);
if (x != NULL) {
strcpy(x, "hello"); /* x is now a string of length 5. x points
to 10 chars of useful memory */
}
以下不是字符串:
char x[5] = "hello"; /* no terminating 0 */
char y = 1;
char *x = &y; /* no terminating 0 */
现在在你的代码中,AFunc
的第一个参数,即使char *
不一定是字符串。事实上,在你的例子中,它不是,因为它只指向一个有一个有用元素的内存,而且它不是零。
根据您想要更改字符串的方式以及字符串的创建方式,有几个选项。
例如,如果myStr
指向可写内存,则可以执行以下操作:
/* modify the data pointed to by 'data' of length 'len' */
void modify_in_place(char *data, size_t len)
{
size_t i;
for (i=0; i < len; ++i)
data[i] = 42 + i;
}
另一种稍微不同的方法是,函数修改data
,直到它看到终止0
:
void modify_in_place2(char *data)
{
size_t i;
for (i=0; data[i]; ++i)
data[i] = 42 + i;
}
答案 2 :(得分:1)
你只处理字符和字符指针。没有任何char指针是有效的字符串,因为它们不是以空值终止的。
尝试定义字符串并查看它的外观。
答案 3 :(得分:1)
But what if the string was more than one char? How would the code look
differently? Thanks for any help
当然,你也可以修改其他角色,但与你第一次完全相同。
对于字符串,char数组将是一个更明确的术语。