玩转字符串函数

发布于 2024-12-18 04:11:12 字数 504 浏览 0 评论 0原文

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

#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;
}

This is a very small question, and probably something really silly! But why am I getting garbage returned in my output for this function which should remove double letters?

#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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

国际总奸 2024-12-25 04:11:12

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

编辑:当然这不是一个完全可靠的方法。

即像这样:

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

You need a separate count for your 'new' array. You're storing them at index 'i' (where you found the character), but what you really want is to store them from position 0 and increment this count instead.

EDIT: Of course this isn't a fullproof method.

i.e something like this:

   for ( i = 0; i < c; i++)
   {
        if (toupper(s[i]) != toupper(s[i+1]))
        {
            new[count++]= toupper(s[i]);
        }
   }
   new[count] = '\0';
凡间太子 2024-12-25 04:11:12

该行

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;

The line

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

should be

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

And you then need before the strdup new[i]=0;

Braces would not go amise either.

EDIT

Forgot need to change the following

int i, j=0;

and in the for loop

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

and after the for loop

new[j] = 0;
初与友歌 2024-12-25 04:11:12

这是该算法的一个相当紧凑的 C99 版本(省略了标头,示例):(

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;
}

此版本区分大小写。)

Here's a reasonably compact C99 version of the algorithm (headers omitted, 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;
}

(This one discriminates case.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文