改变char数组中的字符

Posted

技术标签:

【中文标题】改变char数组中的字符【英文标题】:changing characters in char array 【发布时间】:2020-12-30 18:00:09 【问题描述】:

我无法完成以下任务:

    接受有限的字符数组 更改数组中的给定字符 打印更改的字符数组

这是我的代码:

#include <iostream>
using namespace std;

void change(const char* source, char* target) 
  int j;

  for (j = 0; j < 100; j++) 
    if (source[j] == '.') 
      target[j] = '\n';
    

    else 
      target[j] = source[j];
    
  

  return;


int main() 
  int i;
  char input[100] = 0, output[100] = 0;

  cout << "Bitte geben Sie einen Text ein: " << endl;
  cin >> input[100];

  change(&input[100], &output[100]);

  for (i = 0; i < 100; i++) 
    cout << output[i];
  

  return 0;

我是一名学生,对整个数组/指针以及如何将它们正确传递给函数主题感到非常困惑。另外我想找到一个不使用 string/getline() 的解决方案,只是为了更好的练习。 提前致谢!

【问题讨论】:

您的代码在此处具有未定义的行为(在其他地方类似):input[100],如果您声明了一个包含 100 个元素的 char 数组,则有效索引来自099。因此,在达到这条线之后,您的程序会出现很多问题。我们不知道会发生什么,但告诉你:不要这样做永远 在询问家庭作业问题时,请尽量将您的问题简化为您遇到的具体问题,而不是仅仅说“我的代码不起作用”。 @JarMan 对不起,第二次在这里发帖,以后有问题我会尽量发帖的。 【参考方案1】:

比你想象的要简单,试试这个版本

cin >> input;

change(input, output);

认为input[100] 以某种方式代表整个数组是一个非常常见的初学者误解。没有。

当您声明一个数组时,[] 之间的数字是数组的大小,但是当您使用数组时,[] 之间的数字是您希望访问的元素的索引。这些是完全不同的含义,您不应混淆。此外,由于大小为 100 的数组只有从 0 到 99 的有效索引,input[100] 实际上是在尝试访问不存在的数组元素。

另一个错误是您需要将循环限制为字符串的实际长度,可能小于 100。

你可以使用strlen函数找到字符串的长度,像这样

int length = strlen(output);
for (i = 0; i < length; i++) 
    cout << output[i];

【讨论】:

一个关于使strlen工作的特殊酱汁的快速新程序员笔记。用于表示字符串的字符数组始终以字符串中不存在的特殊字符 null 结尾。 strlen 读取直到找到终止符。如果您忘记放置终止符,strlen 将继续阅读,直到找到终止符,没有人可以安全地预测何时会出现。所有基于字符数组的字符串操作函数都以相同的方式运行,因此您必须留意那些空终止符。常见错误的主要来源。【参考方案2】:

另一种看待程序的方式:

#include <algorithm>
#include <iostream>

using std::cin;
using std::cout;
using std::endl;

// only accepts arrays of predetermined length
void change(const char (&source)[100], char (&target)[100])

   int j = 0;
   for(; j < 100 && source[j] != '\0'; ++j)
   
      target[j] = (source[j] == '.') ? '\n' : source[j];
   
   // make sure we null terminate string
   target[std::min(j, 100 - 1)] = '\0';


int main()

   char input[100];

   cout << "Bitte geben Sie einen Text ein: " << endl;
   cin >> input; // This reads until first non-whitespace, usually a "word"

   char output[100] = ;
   change(input, output);

   for(int i = 0; i < 100 && output[i] != '\0'; i++)
   
      cout << output[i];
   

   return 0;

但由于上述内容确实可以读取带有空格的文本,因此您需要像 std::getline 这样的“原始”阅读器,它可以很好地处理这个问题。但是由于您不想要getline 的解决方案,我们可以使用&lt;cstdio&gt; 函数std::fgets

只需换行:

   cout << "Bitte geben Sie einen Text ein: " << endl;
   std::fgets(input, 100, stdin);

我们最多可以读取 99 个字符,而不会覆盖缓冲区。

您也可以使用std::scanf。下面我们要求它读取最多 100-1 个字符,并且只允许任何内容,直到我们到达 \n。通常%s 会一直读到下一个空格。

   cout << "Bitte geben Sie einen Text ein: " << endl;
   std::scanf("%100[^\n]s", input);

【讨论】:

以上是关于改变char数组中的字符的主要内容,如果未能解决你的问题,请参考以下文章

将字符串传递给 char 数组,然后在 C 中的位置 x 处修改 char 数组

Java新人,关于String类中,private final char value[],到底是数组本身不可变还是数组中的值不可变

如何将char数组中的值与另一个char进行比较

删除 char 数组中的字符

const数组如何只能在每个元素中包含字符,但char *数组能够指向每个元素中的字符串?

如何检查 char 数组中的空格?