【问题标题】:Sending a pointer of a character array to a function in C将字符数组的指针发送到 C 中的函数
【发布时间】:2012-10-05 00:16:01
【问题描述】:

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

这就是我所拥有的:

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

感谢大家的帮助!

【问题讨论】:

    标签: c arrays string pointers character


    【解决方案1】:

    试试这样的:

    #include <stdio.h>
    
    void exclaim(char * s)
    {
        while (*s != '\0')
        {
            putc(*s);
            ++s;
        }
    }
    

    注意事项:

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

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

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

    【讨论】:

      【解决方案2】:

      你的 main() 没问题。

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

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

      使用指针算法

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

      使用索引

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

      【讨论】:

      • 太完美了,现在如果我想测试其中的字符以将句点更改为感叹号,是否可以像这样简单: char test_char = "%c", msg[i]; if (test_char = '.') { msg[i] = '!'; }
      • “%c”是函数“printf”的一个参数,与索引本身并没有真正的关系。所以,更简单: if( msg[i] == '.' ) msg​​[i] = '!';
      【解决方案3】:

      你应该使用:

        the_char = *msg;
      

      不是:

        the_char = msg;
      

      【讨论】:

        【解决方案4】:
        *msg = *(msg++); 
        

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

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

        【讨论】:

          【解决方案5】:

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

          您需要更改以下行,

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-01-12
            • 2021-06-28
            • 1970-01-01
            • 1970-01-01
            • 2012-12-11
            • 1970-01-01
            • 2018-11-12
            相关资源
            最近更新 更多