当 str 定义为 char str[100] 时,scanf 不能与 &str 一起使用

scanf does not work with &str when str is defined as char 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]!='[=10=]')
    {
        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]!='[=10=]')
        {
            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 character\n",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?由于您只有 return 值 0 或很大,请考虑使用 unsigned 而不是 int 作为 i 的类型和 return 值。

  3. 重复(小问题):最好将变量范围最小化,因此 for(int i = 0; ... 并在初始化它的地方声明标志。您应该在技术上确保下溢时 n > INT_MIN + 1,或者将类型更改为 unsigned 值,或者自己在内部计算。

您还可以为每个字母创建一个计数数组。初始化为0,每找到一个字母就加1。然后报告 count > 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 character\n", (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] !='[=10=]')
        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 character\n",str[i]);
}

//test case
int main()
{
    char str[CHAR_SIZE];
    puts("Enter string\n");
    scanf("%s",str);
    int n= length(str);
    printf("len of entered str is %d\n\n", n);
    duplicate(str,n);
}