我正在尝试比较字符串文字,我想删除重复的文字而不使用POINTERS。
这是我的代码:
char str[30];
printf("Enter strings : ");
fgets(str,29,stdin);
char tem[30];
int count , county;
for(count = 0 ; count < strlen(str)-1 ; count++) {
for(county = 1 ; county < strlen(str) ; county++) {
if(str[count] != str[county]) {
tem[count] = str[count];
}
}
}
//PRINT
for(count = 0 ;count < strlen(str) -1 ; count++) {
printf("%c",tem[count]);
}
输入:happen
预期输出:hapen
答案 0 :(得分:4)
更正您的代码:
#include <stdio.h>
#include <string.h>
int main()
{
char str[30];
printf("Enter strings : ");
fgets(str,30,stdin);
char tem[30];
size_t count;
size_t county=0;;
for(count = 0 ; count < strlen(str)-1 ; count++) {
if(str[count] != str[count+1]) {
tem[county++] = str[count];
}
}
tem[county] = '\0';
printf("%s\n", tem);
return 0;
}
请注意,如果此字符在sting中有+1位移,则此代码会删除双字符。
修改强>
要mspi
作为输入字符串mississippi
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
char str[30];
printf("Enter strings : ");
fgets(str,30,stdin);
char tem[30];
size_t count;
size_t county;
size_t tem_index = 0;
size_t size_of_string = strlen(str);
bool found;
for(count = 0 ; count < size_of_string-1; count++)
{
found = false;
county = count+1;
while ((found == false) && (county<size_of_string))
{
if(str[count] == str[county])
{
found = true;
}
county++;
}
if (found == false)
{
tem[tem_index++] = str[count];
}
}
tem[tem_index] = '\0';
printf("%s\n", tem);
return 0;
}
编辑2
要misp
作为输入字符串mississippi
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
char str[30];
printf("Enter strings : ");
fgets(str,30,stdin);
char tem[30];
size_t count;
size_t county;
size_t tem_index = 0;
size_t size_of_string = strlen(str);
bool found;
for(count = 0 ; count < size_of_string-1; count++)
{
found = false;
county = 0;
while ((found == false) && (county<tem_index))
{
if(str[count] == tem[county])
{
found = true;
}
county++;
}
if (found == false)
{
tem[tem_index++] = str[count];
}
}
tem[tem_index] = '\0';
printf("%s\n", tem);
return 0;
}
请注意,所有这些解决方案都区分大小写。
答案 1 :(得分:1)
你删除allduplicates的代码还没有完成:
您对新字符串和旧字符串使用相同的索引,但是您需要两个不同的索引,因为新字符串与旧字符串一样长或短。如果旧字符串是&#34; aaab&#34;,当您看到&#34; b&#34;时,旧字符串的索引为3,但新字符串的索引仅为1.(跳过索引你在字符串中留下未初始化的空白。)
您期待找到同一个字母的其他匹配项,但是对于每个没有字母的字母,您都会附加到新字符串中。您必须查看以下所有字母,但必须只附加一次新字符串。也就是说,您必须根据您在循环中找到的信息,在循环后决定该字母是否重复。
当你向前看的时候,你不应该开始1,而是在他当前的信之后的那封信上。如果从一开始,你会发现第一个字母后面的每个字母都有重复,因为你自己检查每个字母。
这不是一个恐怖,但在循环中反复调用strlen
并不是一个好主意。输入字符串的长度不会改变,因此您可以预先确定字符串长度。如果您只想将它用作终止条件,则可以测试当前字母是否为空终止符。
下面是一个使用你的逻辑的解决方案,虽然是向后看,而不是前进。 (如果你期待,你会复制一封信的最后一次出现,如果你回头看,你会复制第一次出现。这可能会对字母的顺序产生影响。对于密西西比州,你是&#39;得到&#34; Mspi&#34;或&#34; Misp&#34;取决于您使用的策略。)
程序会覆盖相同的字符串。这是可能的,因为您要过滤掉字母,新索引等于旧索引或更小:
#include <stdlib.h>
#include <stdio.h>
void remdup(char *str)
{
int i = 0; // index into old string
int j = 0; // index into new string
for (i = 0; str[i]; i++) {
int k = 0;
int dup = 0;
for (k = 0; k < i; k++) {
if (str[i] == str[k]) {
dup = 1;
break;
}
}
if (dup == 0) str[j++] = str[i];
}
str[j] = '\0';
}
int main()
{
char str[] = "Mississippi";
puts(str);
remdup(str);
puts(str);
return 0;
}
此解决方案不适用于大字符串。一种更有效的方法是保留一个表格,其中已经使用了256个可能的字符中的哪一个。