将字符数组的指针发送到C中的函数

时间:2012-10-15 02:36:21

标签: c arrays string pointers character

好的,长话短说我遇到了一些麻烦: 我正在尝试将字符数组(字符串)的起始地址发送到函数。一旦函数获得指针,我希望函数逐个解析字符(以便修改某些字符)。截至目前,我只是将其设置为打印每个角色,但我仍然失败了。

这就是我所拥有的:

#include "system.h"
#include <stdio.h>

typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;

void EXCLAIM(char *msg){
    char the_char = 0;
    the_char = msg;
    while (the_char != 0)
    {
        printf(the_char);
        *msg = *(msg++);
        the_char = *msg;
    }
}

int main(void) {
    char *first_str = "This is a test. Will this work. I. am. Not. Sure...";
    while (1) {
        EXCLAIM(first_str);
    }
}

编辑:

以下是我尝试做的更新代码;发送指针并遍历每个字符,用感叹号替换所有句点。

#include "system.h"
#include <stdio.h>

typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;

void exclaim(char *msg){
    int i;
    for( i=0; msg[i]; i++ )
    {
        if (msg[i] == '.') {
            msg[i] = '!';
        }
    }
printf(msg);
}

int main(void) {
    char *the_sentences = "This is a test. Will this work. I. am. Not. Sure...";
    while (1) {
        exclaim(the_sentences);
    }
}

谢谢大家的帮助!

5 个答案:

答案 0 :(得分:1)

尝试这样的事情:

#include <stdio.h>

void exclaim(char * s)
{
    while (*s != '\0')
    {
        putc(*s);
        ++s;
    }
}

注意:

  • 不要喊。除了预处理器宏之外,不要使用全部大写。

  • 打印字符,而不是字符串。

  • 无需再制作副本。函数参数已经一个可以直接使用的局部变量。

答案 1 :(得分:1)

你的主()很好。

问题在于EXCLAIM中的指针算术。

我可以看到两个有用的不同版本:

使用指针算术

while (*msg)
{
    printf("%c", *msg);
    msg++
}

使用索引

int i;
char the_char;
for( i=0; msg[i]; i++ )
{
    printf( "%c", msg[i] );
}

答案 2 :(得分:1)

您应该使用:

  the_char = *msg;

  the_char = msg;

答案 3 :(得分:1)

*msg = *(msg++); 

你想用这行代码做什么?你明白它究竟是做什么的吗?首先,您需要知道msg++更改指针的值。然后指定USED指向新位置的任何内容。这意味着整个字符串将被替换为字符串中第一个字符的副本。

故事的寓意是不要在一行代码中做太多。您必须特别注意增量运算符++。即使是经验丰富的程序员通常会将msg++这样的东西放在自己的行中,因为当你尝试将它与复杂的表达式混合时会变得太复杂。

答案 4 :(得分:1)

未提及的东西,但是,尝试修改字符串文字是未定义的行为。

您需要更改以下行,

char *the_sentences = "This is a test. Will this work. I. am. Not. Sure...";

到一个数组。

char the_sentences[] = "This is a test. Will this work. I. am. Not. Sure...";

然后随意修改你的功能内容。

#include <stdio.h>

void foo(char *msg)
{
    for (; *msg; msg++)
        if (*msg == '?')
            *msg = '!';
}

int main(void)
{
    char line[] = "Hello, world?? How are you tonight??";

    foo(line);

    puts(line);
    return 0;
}