-1

我试图将字符串中的每个字母替换为下一个字母(a->b、c->d等)。

编译并运行程序后,我得到了随机符号或XXXX。

#包括<iostream>#包括<string>使用命名空间标准;整型main(){char arr1[26]={'a','b','c','d',“e”、“f”、“g”、“h”、,“i”、“j”、“k”、“l”、,'m','n','o','p',“q”、“r”、“s”、“t”、,“u”、“v”、“w”、“x”、,“y”、“z”};字符串x;getline(cin,x);对于(int i=0;i<x.length();i++){对于(int h=0;h<26;h++){如果(x[i]==arr1[h]){x[i]=arr1[h+1];}}}cout<x;返回0;}

我想我在char数据类型方面做得不对。

8

3个答案

重置为默认值
5

您的代码有两个问题。首先,如果h==25,然后小时+126,而且没有arr1[26]这就是“随机符号”的来源。

第二个问题是,一旦你替换了字符,你仍然会再次检查它,它会找到另一个匹配项并替换它,然后重新检查(等等)。

您可以更改您的如果这样的陈述:

如果(x[i]==arr1[h]){x[i]=arr1[(h+1)%26];//如果h+1>26,则返回到0(即“a”)中断;//不要继续搜索其他匹配项}

您可以在以下情况下更改处理值的方式h==25不管你怎么想,为了简单起见,我只是将其改为0。

1
  • 或者将数组大小更改为27,并添加一个“a”在最后一个位置。然后arr1[h+1]始终有效。 评论 6月18日16:49
0

在内部for循环内

对于(int h=0;h<26;h++){如果(x[i]==arr1[h]){x[i]=arr1[h+1];}}

如果这封信x(i)在数组中找到arr1型在位置小时然后改成字母arr1[小时+1]由于这个声明

x[i]=arr1[h+1];

因此,在for循环的下一次迭代中(如果小时+1小于26)再次找到更新后的字母,并将其更改为数组中的下一个字母arr1型。for循环的迭代在条件小时<26是真的。作为for循环最后一次迭代的结果,表达式arr1[h+1]访问数组外部的内存arr1型调用未定义的行为。

只要有一个等于表达式的字母,就需要中断内部for循环x(i)在数组中找到arr1型如果找到的信是“z”(数组的最后一个元素)需要分配给表达式x(i)字母“a”(arr1[0])而不是表达arr1[h+1]

但要注意使用打破循环中的语句通常是一种糟糕的编程风格。此外,没有必要使用普通for循环来引入辅助变量小时例如,可以使用基于范围的For循环代替外部For循环。也不要使用幻数作为26。通常使用幻数会导致程序中出现错误。

至少你可以写包括标题<迭代器>以下方式

字符arr1[]={'a','b','c','d',“e”、“f”、“g”、“h”、,“i”、“j”、“k”、“l”、,'m','n','o','p',“q”、“r”、“s”、“t”、,“u”、“v”、“w”、“x”、,“y”、“z”};//...对于(size_th=0;h<std::size(arr1));h++){

或者for循环语句也可以这样编写

对于(size_th=0,n=std::size(arr1));h<n;h++){

我可以提出以下解决方案。

#包括<iostream>#包括<string>#包含<字符串视图>#包含<迭代器>整型main(){const std::string_view lower_case_letters=“abcdefghijklmnopqrstuvwxyz”;if(标准::字符串s;标准::getline(标准:;cin,s)){for(char&c:s){auto pos=lower_case_letters.find(c);if(pos!=标准::字符串视图::npos){c=小写字母[(pos+1)%std::size(小写字母)];}}标准::cout<<s<<'\n';}}

程序输出可能如下所示

abcxyz公司卡迪扎
-1

或者,为了处理大小写敏感性,我们可以这样做:

#包括<iostream>#包括<string>使用命名空间std;整型main(){字符串x;getline(cin,x);for(char&c:x){//通过引用遍历字符if(isalpha(c)){//检查字符是否为字母if(tollower(c)=='z'){//处理'z'和'z'c=公差(c)==‘z’?’a':'a';}其他{c++;//切换到下一个字母}}}cout<<x<<endl;返回0;}

解决的问题:

  • 当您到达字母“z”时,arr1[h+1]尝试访问元素超出数组的边界,导致未定义的行为

  • 您可以直接计算移位的角色。不需要
    嵌套循环

  • 该代码不处理大写字母

1

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.