使用字符串函数

时间:2011-11-24 16:48:13

标签: c arrays string

这是一个非常小的问题,可能真的很傻!但是为什么我在输出中为这个函数返回垃圾,这个函数应该删除双字母?

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

char  *makehello( char *s ) {
   char new[16] ;
   int i ;
   int c = strlen(s);
   for ( i = 0; i < (c + 1); i++)
     if (toupper(s[i]) != toupper(s[i+1]))
       new[i] = toupper(s[i]);
return strdup( new ) ;  
}

int main(void) {
 char *new;
 char data[100];
 scanf("%s", data);
 new = makehello(data);
 printf("%s", new);
return 0;
}

3 个答案:

答案 0 :(得分:2)

您需要为“新”数组单独计数。您将它们存储在索引'i'(您找到该字符的位置)中,但您真正想要的是将它们从位置0存储起来并改为增加此计数。

编辑:当然这不是一种全面的方法。

即是这样的:

   for ( i = 0; i < c; i++)
   {
        if (toupper(s[i]) != toupper(s[i+1]))
        {
            new[count++]= toupper(s[i]);
        }
   }
   new[count] = '\0';

答案 1 :(得分:0)

该行

for ( i = 0; i < (c + 1); i++) 

应该是

for ( i = 0; i < (c - 1); i++)

然后你需要在strdup new [i] = 0;

之前

大括号也不会好意思。

修改

忘了需要更改以下内容

int i, j=0;

和for循环

new[j++] = toupper(s[i]);

和for循环之后

new[j] = 0;

答案 2 :(得分:0)

这是一个相当紧凑的C99版本的算法(标题省略,example):

const char * makehello (const char * s)
{
  char new[16] = { *s, 0 };
  const char * p = s;
  char c = *s, * q = new;

  while (*p) { if (*++p != c) { c = *++q = *p; } }

  return strdup(new) ;
}

int main(void)
 {
  char data[100];
  scanf("%s", data);
  printf("%s", makehello(data));
  return 0;
}

(这个区别于案件。)