void函数,删除非字母字符

时间:2018-01-07 19:43:35

标签: c string

我正在尝试编写一个程序,它会获得几个字符串,直到它得到“Q' string(此字符串基本上停止scanf)。 每个字符串都被发送到一个除了字母之外的所有东西。例如,如果我扫描' AJUYFEG78348' printf应该是'AJUYFEG'。 问题是该功能必须是无效的。 我已经尝试了几种方法来制作只有字母"的新数组。印刷,但没有一个工作。 (不允许使用strlen函数)

<div class="a">
  <div class="one">text</div>
  <div class="two">text</div>
</div>
<div class="b">
  <div class="three">text</div>
  <div class="four">text</div>
  <div class="five">text</div>
</div>
<div class="c">
  <div class="six">text</div>
</div>

3 个答案:

答案 0 :(得分:1)

这个函数只有一个参数,非const char指针的事实暗示了字符串将在调用中被更改的事实(无论如何更好地记录它),并且它完全没问题。

对您的代码进行一些修复可以使其正确:

首先,不要循环到缓冲区的末尾,只是到字符串的末尾(没有strlen,它可能更快):

for (i=0; str[i] != '\0'; i++)

然后不要忘记在处理完毕后终止新字符串:

new_string[j] = '\0';

然后,最后(您打印字符串的位置)将新字符串复制到旧字符串中。因为它更小,所以没有风险:

strcpy(str,new_string);

现在str包含新的剥离字符串。

另一种方法是就地工作(没有另一个缓冲区):每次遇到要删除的字符时,在该位置复制字符串的其余部分,然后重复。如果要删除大量字符,但使用较少的内存,效率可能会很低。

答案 1 :(得分:1)

这里的关键是你永远不会在字符串中插入新字符。这可以保证输入缓冲区足够大以保存结果。它还提供了一个简单的就地解决方案,这是void返回类型所暗示的。

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

void RemoveNonAlphaBetChars(char* str)
{
    char *from, *to;

    for(from = to = str; *from; from++) {
        if(isalpha(*from)) {
            if(from > to) *to = *from;
            to++;
        }
    }
    *to = *from;
    printf("%s\n", str);
    return;
}

指针from沿着字符串步进,直到它指向NUL字符,因此循环中的简单条件。如果to是一个字符,from只会收到memmove的值。循环后的最终副本确保NUL终止。

<强>更新

如果你正在处理1)特别大的字符串,2)你有很长的字母,其间有一些数字,3)你的#include <stdio.h> #include <ctype.h> #include <string.h> ... void RemoveNonAlphaBetChars(char* str) { char *from, *to, *end; size_t len; for(from = to = str; *from; from = end) { for(; *from && !isalpha(*from); from++) ; for(end = from; *end && isalpha(*end); end++) ; len = end - from; if(from > to) { if(len > 1) { memmove(to, from, len); } else { *to = *from; } } to += len; } *to = *end; printf("%s\n", str); return; } 版本经过高度优化与手动复制内容(例如,使用特殊处理器指令)相比,您可以执行以下操作:

from

一般的想法是找到每个字母范围的限制(endto之间),并逐块复制到{{1}}。正如我之前所说,这个版本不应该用于一般情况。只有在满足特定条件的大量数据时,它才会给你提升。

答案 2 :(得分:0)

void返回类型是制作产生C字符串结果的函数的常用方法。您有两种设计API的方法:

  • 创建一个非破坏性的API,它接受输出缓冲区及其长度,或
  • 制作一个可以更改字符串的API。

第一种方法如下:

void RemoveNonAlphaBetChars(const char* str, char *result, size_t resultSize) {
    ...
}

使用result代替new_string,并确保不要超过resultSize。电话会是这样的:

if (flag == 1) { // if (flag == 1), not while (flag == 1)
   char result[100];
   RemoveNonAlphaBetChars(array, result, 100);
   printf("%s\n", result);
}

如果您决定使用第二种方法,请将printf移至main,然后使用strcpynew_string的内容复制回str

strcpy(str, new_string);
相关问题