需要编写一个函数,在字符串中搜索来自abc的一系列字母..删除它们,只留下序列的第一个和最后两个。 例如,如果输入字符串是: dabcemoqmnopqrrtaduvwxaz 输出应该是: DA-cemoqm-rrtadu-XAZ
这是我写的函数: 但它不起作用......
#include <stdio.h>
#include <string.h>
main()
{
char str[100];
printf("please enter a String");
scanf ("%c", &str);
for (int i=o; i< strlen(str); i++)
{
count=0;
while(str[i+1]= str[i]+1)
{
if (count==0 || str[i+2]!=str[i]+1)
str[i+1]="-";
else
str[i+1]="";
count++;
}
printf("the correct String is:" %c, str);
}
}
答案 0 :(得分:2)
测试运行:
Please enter a string: kswa0123456789abcdeffABCDEFQRSTUVWXYZaaaab
Input: kswa0123456789abcdeffABCDEFQRSTUVWXYZaaaab
Output: kswa0-9a-ffA-FQ-Zaaaab
Please enter a string: dabcemoqmnopqrrtaduvwxaz
Input: dabcemoqmnopqrrtaduvwxaz
Output: da-cemoqm-rrtadu-xaz
工作代码:
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[100];
//strcpy(str, "dabcemoqmnopqrrtaduvwxaz");
printf("Please enter a string: ");
if (scanf("%99s", str) != 1)
return(1);
printf("Input: %s\n", str);
int len = strlen(str);
char *dst = str;
int j = 0;
for (int i = 0; i < len; i++)
{
int k;
for (k = i; k < len; k++)
{
//printf("cmp %d (%c) and %d (%c)\n", k, str[k], k+1, str[k+1]);
if (str[k+1] != str[k]+1)
break;
}
if (k >= i+2)
{
//printf("squish %d (%c) to %d (%c)\n", i, str[i], k, str[k]);
dst[j++] = str[i];
dst[j++] = '-';
dst[j++] = str[k];
i = k;
}
else
dst[j++] = str[i];
}
dst[j] = '\0';
printf("Output: %s\n", str);
return(0);
}
答案 1 :(得分:1)
简单地说,该功能不能满足您的需求。不管怎样,或者我严重误解了你的意图。
此外,您有许多错误,或至少是可疑的陈述:
scanf ("%c", &str); // This reads a single character, not a string
int i=o // Did you want a zero here?
str[i+1]="-"; // You probably meant '-', single quotes
str[i+1]= str[i]+1 // Eh? Did you mean `==`? Why?
我真的不明白代码应该如何工作,我不知道如何解决它。但是,我可以指向另一个方向:
如果我理解了要求,则输出字符串可能比输入字符串短。就地工作(在输入之上)只会使事情变得复杂。
尝试重写算法以使用输入字符串和输出字符串。在符合或不符合条件时将字符串中的字符复制到另一个字符串。类似于此的东西:
j = 0;
for (int i = 0; i < strlen(input); i++)
if (condition(input, i))
output[j++] = input[i]
“条件”含糊不清,我看不到它在您的代码段中强制执行。您可能希望编写一个辅助函数is_abc
,它将告诉您子字符串是否包含在字母表中。
tl;dr
你需要考虑一下。可能会审查您的学习材料。