2013-11-26 29 views
0

我写了一段代码,但我无法获得所需的输出。我犯了一些错误,但无法追查到底是什么。 以下是我的代码。方法。通过计算连续的字母来编码字符串。例如:“a2b2a2d3c1”

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    char c[] = "aabbaadddc",*ptr = c,prev,t[10],*tptr = t; 
    int i,j,count = 0; 
    while(*ptr != '\0') { 
     prev = *ptr; 
     count = 0; 
     while(*ptr == prev) { 
      count++; 
      ptr++; 
     } 
     *tptr = prev; 
     tptr++; 
     *tptr = (char)count; 
     tptr++; 
    } 
    *tptr = '\0'; 
    printf("%s\n", t); 
    return 0; 
} 

我期待t字符串中的“a2b2a2d3c1”。我想知道我的错误。

回答

2

你应该改变第17行至

*tptr = (char)(count + '0'); 

0 ASCII值添加到您的计数器。

,但我会改变代码,因为它有几个问题:

  • 如果我们有abcdestrlen = 5)字符串结果字符串应该是a1b1c1d1e1strlen = 10)。因此,我们获得缓冲区溢出
  • 如果发生一些字符超过10倍,我们得到不正确的结果字符串

为了使这个算法对的,我会用另一个缓冲区有足够的大小来存储所有的值,并添加值(字符和数字)在那里。要将int转换为char[]请使用itoasnprintf

+0

是的,如果出现超过10次的字符,我们会得到不正确的结果,请问是什么原因? – Megharaj

+0

@Megharaj因为你处理字符。要写数字'10',你必须写2个字符。其实这取决于你的任务。如果你知道它永远不会发生,只需分配足够大的char数组来存储所有新字符。如果您需要编写安全功能,请查看我的更新。 – Deck

+0

非常感谢。这帮助了我。 – Megharaj

2

从我看到

*tptr = prev; 
tptr++; 
*tptr = (char)count; 

是错误的。

应该

*tptr = count+48; 

我不知道你将如何与这个algorithm.I管理双位数字会建议你看看sprintf function.It将你的情况有所帮助。

+0

谢谢您的回答和建议 – Megharaj

1

t太短 - 没有空间来终止\ x00!

此外,你插入一个字符\ x02(从柜台),而不是'2'。这意味着你将需要添加“0”,以得到正确的输出:

*tptr = (char)count + '0'; 
0
#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    char c[] = "aabbaadddc",*ptr = c,prev; 
    char t[10];        // t is too small - there is no room for the string terminator 
    char *tptr = t; 
    int i,j,count = 0; 
    while(*ptr != '\0') { 
     prev = *ptr; 
     count = 0; 
     while(*ptr == prev) { 
      count++; 
      ptr++; 
     } 
     *tptr = prev; 
     tptr++; 
     *tptr = (char)count; // You need to add the ascii value for 0 
     tptr++; 
    } 
    *tptr = '\0'; 
    printf("%s\n", t); 
    return 0; 
} 

一些注意事项和意见:

你的代码是不是很普遍。编码应该在一个函数中,main应该保存代码来测试函数(调用它并打印结果)。

您的代码最多只能处理9个字母。

如果源字符串包含数字,则编码算法不可逆。

相关问题