C 我用于检查字符串内容和长度的程序出现了一些问题
我无法在命令提示符中键入第二个输入,它表示我的程序已停止。我只是在尝试我自己的代码。 我添加了两个函数来检查字符串的长度和内容。 我可以简单地使用strcmp(),但我避免在实践中使用它C 我用于检查字符串内容和长度的程序出现了一些问题,c,c-strings,strcmp,strlen,C,C Strings,Strcmp,Strlen,我无法在命令提示符中键入第二个输入,它表示我的程序已停止。我只是在尝试我自己的代码。 我添加了两个函数来检查字符串的长度和内容。 我可以简单地使用strcmp(),但我避免在实践中使用它 #include<stdio.h> #include<string.h> int lencompare(char *str1, char *str2){ int len1, len2; len1 = strlen(str1); len2 = strlen(str2
#include<stdio.h>
#include<string.h>
int lencompare(char *str1, char *str2){
int len1, len2;
len1 = strlen(str1);
len2 = strlen(str2);
return (len1==len2) ? 1 : 0;
}
int compare(char *str1, char *str2){
int i =0, flag=0;
if(lencompare(str1, str2)==1){
while(*(str1+i) != '\0');
{
if(*(str1+i) == *(str2+i))
flag = 1;
else
flag = 0;
i++;
}
return flag;
}
if(lencompare(str1, str2) == 0){
printf("Length is Different");
}
}
int main(){
char *str1 , *str2 ;
fgets(str1, 20, stdin);
fgets(str2, 20, stdin);
if(compare(str1, str2) == 1){
printf("both length and content are same");
}
return 0;
}
#包括
#包括
int lencompare(字符*str1,字符*str2){
int len1,len2;
len1=strlen(str1);
len2=strlen(str2);
返回值(len1==len2)?1:0;
}
int比较(char*str1,char*str2){
int i=0,flag=0;
if(lencompare(str1,str2)==1){
而(*(str1+i)!='\0');
{
如果(*(str1+i)=*(str2+i))
flag=1;
其他的
flag=0;
i++;
}
返回标志;
}
if(lencompare(str1,str2)==0){
printf(“长度不同”);
}
}
int main(){
字符*str1,*str2;
fgets(str1,20,stdin);
fgets(str2、20、stdin);
如果(比较(str1,str2)==1){
printf(“长度和内容相同”);
}
返回0;
}
对于初学者来说,这些变量
char *str1 , *str2 ;
未初始化。所以程序已经有了未定义的行为。您需要声明字符数组,例如
enum { N = 20 };
char str1[N], str2[N];
fgets(str1, 20, stdin);
fgets(str2, 20, stdin);
str1[ strcspn( str1, "\n" ) ] = '\0';
str2[ strcspn( str2, "\n" ) ] = '\0';
如果字符数组中有足够的空间,标准函数fgets
可以将新行字符'\n'
附加到输入的字符串中
您应该删除此字符。比如说
enum { N = 20 };
char str1[N], str2[N];
fgets(str1, 20, stdin);
fgets(str2, 20, stdin);
str1[ strcspn( str1, "\n" ) ] = '\0';
str2[ strcspn( str2, "\n" ) ] = '\0';
函数lencompare
的声明和定义如下
int lencompare( const char *str1, const char *str2 )
{
return strlen( str1 ) == strlen( str2 );
}
函数compare
具有未定义的行为,因为在某些执行路径中,它不返回任何内容
也应该声明为
int compare( const char *str1, const char *str2 );
在函数中,您两次调用函数lencompare
:
if(lencompare(str1, str2)==1){
及
程序可以按以下方式运行
#include <stdio.h>
#include <string.h>
int lencompare( const char *str1, const char *str2 )
{
return strlen( str1 ) == strlen( str2 );
}
int compare( const char *str1, const char *str2 )
{
int equal = lencompare( str1, str2 );
if ( equal )
{
while ( *str1 == *str2 && *str1 )
{
++str1;
++str2;
}
equal = *str1 == *str2;
}
return equal;
}
int main(void)
{
enum { N = 20 };
char str1[N], str2[N];
fgets( str1, sizeof( str1 ), stdin );
fgets( str2, sizeof( str2 ), stdin );
str1[ strcspn( str1, "\n" ) ] = '\0';
str2[ strcspn( str2, "\n" ) ] = '\0';
if ( compare( str1, str2 ) )
{
puts( "both length and content are same" );
}
return 0;
}
请注意,您可以使用标准的C函数strcmp
,而不是函数compare
中的while循环。在这种情况下,函数比较将非常简单
int compare( const char *str1, const char *str2 )
{
return strcmp( str1, str2 ) == 0;
}
事实上,没有必要比较字符串的长度 那么,您的程序显示了什么输出?屏幕截图很好。str1和str2需要是缓冲区,最多20个字符-您还没有为它们分配内存。尝试char str1[21],str2[21];您应该修改
标志的使用
。你一直在设置和清除它。将其初始化为1
,如果任何字符不同,则将其设置为0
。如果它们是一样的,不要碰它。另外,在int compare()
中,并非所有控制路径都返回值(请参见编译器警告)。str1[i]
与*(str1+i)
是同一回事,而且更容易理解。