【问题标题】:I am trying to change the string permanently but this code isn't doing it我正在尝试永久更改字符串,但这段代码没有这样做
【发布时间】:2020-04-07 05:01:08
【问题描述】:
    #include<stdio.h>
    #include<conio.h> //**Just To Add getch() function**
    int length(char *p){
        int i; //**I know That these variable are not the same as they are in other function**
        for(i=0;*(p+i)!='\0';i++);
        return i;
    }
    void strrev(char *p){
        int i,len;
        len=length(p);    
        char cpy[len]; //**Already Tried to change it to some fixed value**
        for(i=0;i<len;i++){
            cpy[i]=*(p+len-i);
        }
        for(i=0;i<len;i++){
            *(p+i)=cpy[i];
        }
    }
    int main(){
        char str[20]="computer";
        strrev(str);
        printf("%s",str);
        getch(); //**to Stop The Screen**
        return 0;
    }

我尝试将数组大小更改为固定值,我也尝试更改变量,但我的语法没有错误。

【问题讨论】:

  • 只需迭代到len &gt;&gt; 1。试试这个。
  • 如果你迭代到字符串的长度,你把它倒过来再倒回去。你只需要走一半。

标签: c string function reverse


【解决方案1】:

根据@Yunnosch 的推荐,这是我的评论作为答案。

在您的函数 strrev 中,您迭代整个字符串,即 i 从零到 len / 2 的迭代您正确地抓取了字符,但剩余的迭代只是再次撤消此操作。

因此,只需从零迭代到 len &gt;&gt; 1。位移确保整数除法。

void strrev(char* const str)
{
   const size_t len = strlen(str);
   for(size_t i = 0; i < (len >> 1u); ++i)
   {
     const size_t j = len - 1u - i;
     char c = str[i];
     str[i] = str[j];
     str[j] = c;
   }
}

【讨论】:

  • @TomKarzes 你是对的,必须使用普通的size_t 而不是std::size_t。谢谢。
【解决方案2】:

使用这个cpy[i]=*(p+len-i); 意味着您将\0 终止符放在字符串cpy 的开头。在这种情况下,您的两个字符串都将以 \0 开头,因此 printf 将什么也不做。

所以将cpy[i]=*(p+len-i); 更改为cpy[i] = *(p + len - i-1);

【讨论】:

  • 感谢您的回复,我知道这样,但我想知道我的代码有什么问题!
  • @ShishirTiwari 代码没有错,但是由于您使用 %s 它什么也没做,如果您改用 %c 并循环从函数返回的字符串以逐字符打印它,您将无需更改代码即可成功完成。(最好将 strrev 更改为其他内容)
  • 您是否知道另一个答案,它描述了终止符确实在循环开始时被交换到开头,但在循环结束时又被交换回末尾?我觉得很有说服力。你能详细说明为什么你认为这无关紧要吗?如果这是真的,则意味着您的分析(即 printf 没有输出任何内容)没有抓住重点。你试过输出是什么吗?我承认我没有,但可能不得不支持像你这样的答案。
  • @Yunnosch 我调试了代码,我看到函数的返回是一个字符串开始将终止。
  • @Yunnosch 我编译了代码,printf 没有输出任何东西。我发现这非常有说服力` for(i=0;i\0 被放置在cpy 的第一个,并且“计算机”的c 也将丢失。(因为函数length 不包括\0strlen)和下一个循环字符串cpy 被复制到pp 将返回到main 并且当我运行程序时没有打印任何内容但是当我使用for(int i=0;i&lt;9;i++) printf("%c ", str[i]); 在main 中打印字符串时,它实际上给了我预期输出。
猜你喜欢
  • 2023-02-10
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多