C101 - 字符串与字符:

时间:2010-08-25 05:15:36

标签: c

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);
}

但是如果字符串不止一个字符怎么办?代码看起来会有什么不同?谢谢你的帮助。

4 个答案:

答案 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必须指向一个适当分配的区域,其中某处有0x指向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

当然,你也可以修改其他角色,但与你第一次完全相同。

  1. 声明一个char数组并传递其地址
  2. 修改这些地址的值
  3. 对于字符串,char数组将是一个更明确的术语。