1

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

这就是我所拥有的:

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

感谢大家的帮助!

4

5 回答 5

1

尝试这样的事情:

#include <stdio.h>

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

笔记:

  • 不要大喊大叫。除了预处理器宏之外,不要使用所有大写字母。

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

  • 无需再复制一份。函数参数已经是可以直接使用的局部变量。

于 2012-10-15T02:40:12.527 回答
1

你的 main() 很好。

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

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

使用指针算法

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

使用索引

int i;
char the_char;
for( i=0; msg[i]; i++ )
{
    printf( "%c", msg[i] );
}
于 2012-10-15T02:40:41.410 回答
1

你应该使用:

  the_char = *msg;

不是:

  the_char = msg;
于 2012-10-15T02:46:29.537 回答
1
*msg = *(msg++); 

你想用这行代码做什么?你了解它的实际作用吗?首先,您需要知道msg++更改指针的值。然后,您将它使用的任何内容分配给新位置。这意味着整个字符串将被字符串中第一个字符的副本替换。

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

于 2012-10-15T02:54:28.413 回答
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;
}
于 2012-10-15T04:22:47.797 回答