改变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
数组,则有效索引来自0
到 99
。因此,在达到这条线之后,您的程序会出现很多问题。我们不知道会发生什么,但告诉你:不要这样做永远。
在询问家庭作业问题时,请尽量将您的问题简化为您遇到的具体问题,而不是仅仅说“我的代码不起作用”。
@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
的解决方案,我们可以使用<cstdio>
函数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[],到底是数组本身不可变还是数组中的值不可变