C - 当 str 定义为字符 str 时,scanf 不适用于 &str[100]



有人能告诉我我的语法有什么问题吗。我想找出一个单词中重复的字母。如果我在这里声明一个字符数组本身,但不使用scanf,它就可以正常工作。

#include<stdio.h>
// Finding the duplicate alphabets in a string
int length(char str[]) //Finding the length of the string
{
int len;
while(str[len]!='')
{
len++;
}
return len;
}
void duplicate(char str[],int n)
{
int i,j,flag;
for(i=0;i<=n-2;i++) //Selecting the alphabet for comparison
{
flag=0;
if(str[i]!='')
{
for(j=i+1;j<=n-1;j++) //comparison of alphabets
{
if(str[j]==str[i])
{
flag=1;
str[j]=0;
}
}
if(flag==1)
{
printf("%c is the duplicate charactern",str[i]);
}   

}        

} 
}
int main()
{
char str[100];
scanf("%s",&str);
int n= length(str);
duplicate(str,n);
}

我注意到的问题:

  1. main:scanf("%s",&str);str(char (*)[100](的错误类型,应该是scanf("%s", str);char str[100]使用神奇的100值,而不是#define STR_LEN 99,因此可以执行char str[STR_LEN + 1]。使用scanf的方式会导致缓冲区溢出,而应该使用scanf("%" str(STR_LEN) "s", STR_LEN, str),并且需要#define str(s) xstr(s)#define xstr(s) #s。我建议使用fgets

  2. length:int len;未初始化,应该是int len = 0;(len不是一个好的变量名,因为它通常比上一个索引大1,但您可以使用它进行索引(。为什么你自己写而不是用strlen?由于只返回值0或更大,请考虑使用unsigned而不是int作为i的类型和返回值。

  3. 重复(小问题(:最佳做法是最小化变量作用域sofor(int i = 0; ...,并在初始化它的地方声明标志;INT_MIN+1表示下溢,或者将类型更改为unsigned值,或者自己在内部计算。

您还可以为每个字母创建一个计数数组。已初始化为0,并在找到每个字母时添加1。然后报告计数为>1.这将是一个O(n(算法,而不是原来的O(n^2(。

#include <limits.h>
#define CHARS (UCHAR_MAX+1)
void duplicate(char *str) {
unsigned char counts[CHARS] = { 0 }; // 0, 1 or 2 for 2+
for(unsigned i=0; str[i]; i++) {
char *c = counts + (unsigned) str[i];
*c += *c <= 1;
}
for(unsigned i=0; i<CHARS; i++) {
if(counts[i] > 1) {
printf("%c is the duplicate charactern", (char) i);
}
}
}

根据建议,在尝试使用局部变量之前,请始终确保它们已初始化。至于你的问题,如果你唯一的愿望是找到重复的字符串,那么你可以这样处理:-

#include<stdio.h>
#define CHAR_SIZE 100
int length(char[]);
void duplicate(char[], int);
// Finding the duplicate alphabets in a string
int length(char str[]) //Finding the length of the string
{
int len = 0;
while(str[len] !='')
len++;
return len;
}
//find duplicates
void duplicate(char str[],int n)
{
for(int i =0; i < n; i++)
for(int j=i+1; j<n; j++)
if(str[i] == str[j])
printf("%c is the duplicate charactern",str[i]);
}
//test case
int main()
{
char str[CHAR_SIZE];
puts("Enter stringn");
scanf("%s",str);
int n= length(str);
printf("len of entered str is %dnn", n);
duplicate(str,n);
}

最新更新