我正在尝试编写一个程序,它会获得几个字符串,直到它得到“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>
答案 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
一般的想法是找到每个字母范围的限制(end
和to
之间),并逐块复制到{{1}}。正如我之前所说,这个版本不应该用于一般情况。只有在满足特定条件的大量数据时,它才会给你提升。
答案 2 :(得分:0)
void
返回类型是制作产生C字符串结果的函数的常用方法。您有两种设计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
,然后使用strcpy
将new_string
的内容复制回str
:
strcpy(str, new_string);