当 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);
}
我注意到的问题:
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
。
length: int len;
未初始化,应该是 int len = 0;
(len
不是一个很好的变量名,因为它通常比最后一个索引大 1,但是你用它来索引)。为什么你自己写而不是使用 strlen
?由于您只有 return 值 0 或很大,请考虑使用 unsigned
而不是 int
作为 i
的类型和 return 值。
重复(小问题):最好将变量范围最小化,因此 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);
}
拜托,谁能告诉我我的语法有什么问题。我想在一个单词中找到重复的字母。如果我在这里声明一个字符数组但不使用 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);
}
我注意到的问题:
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
。length:
int len;
未初始化,应该是int len = 0;
(len
不是一个很好的变量名,因为它通常比最后一个索引大 1,但是你用它来索引)。为什么你自己写而不是使用strlen
?由于您只有 return 值 0 或很大,请考虑使用unsigned
而不是int
作为i
的类型和 return 值。重复(小问题):最好将变量范围最小化,因此
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);
}