請有人告訴我我的語法有什么問題。我想在一個單詞中找到重復的字母。如果我在這里宣告一個字符陣列本身但不使用 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]!='\0')
{
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]!='\0')
{
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);
}
uj5u.com熱心網友回復:
我注意到的問題:
main:
scanf("%s",&str);是str(char (*)[100])的錯誤型別,應該是scanf("%s", str);.char str[100]使用一個神奇的 100 值,#define STR_LEN 100所以你可以做char str[STR_LEN 1]. 您使用的方式scanf會受到緩沖區溢位的影響,而您應該使用scanf("%" str(STR_LEN) "s", STR_LEN, str)并且您需要#define str(s) xstr(s)and#define xstr(s) #s。我建議fgets改用。length:
int len;未初始化,應該是int len = 0;(len不是一個很好的變數名,因為它通常比最后一個索引大 1,但你用它來索引)。為什么你自己寫而不是使用strlen?由于您只回傳 0 或很大的值,請考慮使用unsigned而不是int用于型別i和回傳值。重復(小問題):將變數范圍最小化
for(int i = 0; ...并在初始化它的地方宣告標志是一種很好的做法。從技術上講,您應該確保 n > 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 character\n", (char) i);
}
}
}
uj5u.com熱心網友回復:
按照建議,在嘗試使用區域變數之前,請務必先對其進行初始化。至于你的問題,如果你唯一的愿望是找到重復的字串,那么你可以這樣處理:-
#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] !='\0')
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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/363010.html
上一篇:需要有關所需輸出的幫助
