#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main()
{
char s[] = "We promptly judged antique ivory buckles for the next prize";
for(int i=0;i<strlen(s);i++)
{
s[i] = tolower(s[i]);
}
int i=0;
int n=1;
int counter =0;
char *s1;
s1=(char*)malloc(sizeof(char)*n);
s1[0] = s[0];
int k=0;
while(s[i]!='\0')
{
for( k=0;k<strlen(s1);++k)
{
if(s[i] == s1[k] && s[i] !=' ')
++counter;
}
if(counter==0 && s[i]!=' ' )
{
++n;
s1 = realloc(s1, sizeof(char) * (n));
++k;
printf("%d : %d\n",n,k);
s1[k] = s[i];
}
++i;
counter =0;
k=0;
}
s1 =realloc(s1 , sizeof(char)*(n+1));
s1[n] = '\0';
printf("%s\n",s1);
if(n == 26)
printf("yes");
else
printf("No");
return 0;
}
该程序试图检查单词是否为pangram。 如果从数组s中不重复字母,则从数组s中获取一个字母并将其存储在数组s1中。因此,如果while循环结束后数组s1的长度为26,则它具有所有可能的字母。 但是,当我尝试打印s1数组时,它显示只有w具有它的内容。 迷茫到极致...
答案 0 :(得分:0)
不需要您的++k
(在if
语句内),将其删除即可使用:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main()
{
char s[] = "We promptly judged antique ivory buckles for the next prize";
for(int i=0;i<strlen(s);i++)
{
s[i] = tolower(s[i]);
}
int i=0;
int n=2;
int counter =0;
char *s1;
s1=(char*)malloc(sizeof(char)*n);
s1[0] = s[0];
s1[1]='\0';
int k=0;
while(s[i]!='\0')
{
for( k=0;k<strlen(s1);++k)
{
if(s[i] == s1[k] && s[i] !=' ')
++counter;
}
if(counter==0 && s[i]!=' ' )
{
++n;
s1 = realloc(s1, sizeof(char) * (n));
/* ++k; */ /* <== REMOVE IT */
printf("%d : %d\n",n,k);
s1[k] = s[i];
s1[k+1]='\0';
}
++i;
counter =0;
k=0;
}
s1 =realloc(s1 , sizeof(char)*(n+1));
s1[n] = '\0';
printf("%s\n",s1);
if(n == 26)
printf("yes");
else
printf("No");
return 0;
}
k
在for
语句的末尾已经增加,因此以后的++k
是导致错误结果的原因。同样,s1
应该初始化为NULL
终止,并应NULL
终止在if
语句中,因为没有s1
可能包含垃圾。 / p>