永发信息网

C语言中,一个奇怪的结果,求大神解释

答案:5  悬赏:80  手机版
解决时间 2021-11-08 23:44
  • 提问者网友:听门外雪花风
  • 2021-11-08 07:48
C语言中,一个奇怪的结果,求大神解释
最佳答案
  • 五星知识达人网友:夜余生
  • 2021-11-08 07:59
#include
#include
int main()
{
char string1[81]="that";
char string2[81]="these";


switch( strcmp(string1,string2))
{
case -1 : printf("string1 < string2\n"); break;
case 0 : printf("string1 = string2\n"); break;
case 1 : printf("string1 > string2\n"); break;
}
return 0;
}

在具体哪里 有不明白的再问追问printf("%d\n","these">"that");这里“these”与"that "的大小是如何比较的,比较结果为什么是0(即these>that ,不成立)
printf("%d\n","these">string1);这里的结果为什么是1;
if(string1>string2),这里string1>string2是如何比较的,为什么它会成立追答这里引用的是一个工具 就是 strcmp(string1,string2 这个就是 比较两个字符串大小的工具
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1>str2,则返回正数;
若str1特别注意:strcmp(const char *s1,const char * s2)这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
全部回答
  • 1楼网友:痴妹与他
  • 2021-11-08 12:05
你用的什么编译器?我的Pells c上运行结果正常,是
  • 2楼网友:玩世
  • 2021-11-08 11:49
第一个和第三个是比较指针的大小
  • 3楼网友:封刀令
  • 2021-11-08 10:13

你这样比没有类比性  直接用字符串比较不是比较它的ACSSII 值  具体比较的是什么我觉得核能是地址值; 而最后一个 用数组名去比较估计也就是比较数组的开始地址值的比较

 而这个地址是根据 编译环境的不同所取到的值 也不同在我的编译器里 是 string1

  • 4楼网友:詩光轨車
  • 2021-11-08 09:28
#include
#include
int main()
{

003113C0 push ebp 

003113C1 mov ebp,esp 

003113C3 sub esp,17Ch 

003113C9 push ebx 

003113CA push esi 

003113CB push edi 

003113CC lea edi,[ebp-17Ch] 

003113D2 mov ecx,5Fh 

003113D7 mov eax,0CCCCCCCCh 

003113DC rep stos dword ptr es:[edi] 

003113DE mov eax,dword ptr [___security_cookie (317000h)] 

003113E3 xor eax,ebp 

003113E5 mov dword ptr [ebp-4],eax

char string1[81]="that";

    003113E8 mov eax,dword ptr [string "that" (31574Ch)] 

    003113ED mov dword ptr [ebp-5Ch],eax 

    003113F0 mov cl,byte ptr ds:[315750h] 

    003113F6 mov byte ptr [ebp-58h],cl 

    003113F9 push 4Ch 

    003113FB push 0 

    003113FD lea eax,[ebp-57h] 

    00311400 push eax 

    00311401 call @ILT+115(_memset) (311078h)

    00311406 add esp,0Ch

char string2[81]="these";

    00311409 mov eax,dword ptr [string "these" (315744h)] 

    0031140E mov dword ptr [ebp-0B8h],eax 

    00311414 mov cx,word ptr ds:[315748h] 

    0031141B mov word ptr [ebp-0B4h],cx 

    00311422 push 4Bh 

    00311424 push 0 

    00311426 lea eax,[ebp-0B2h] 

    0031142C push eax 

    0031142D call @ILT+115(_memset) (311078h)

    00311432 add esp,0Ch


printf("%d","these">"that"); 
     

    00311435 mov eax,offset string "these" (315744h) 

    0031143A mov ecx,offset string "that" (31574Ch) 

    0031143F cmp ecx,eax 

    00311441 sbb edx,edx 

    00311443 neg edx 

    00311445 mov esi,esp 

    00311447 push edx 

    00311448 push offset string "%d" (315740h) 

    0031144D call dword ptr [__imp__printf (3182C4h)]

    00311453 add esp,8

    00311456 cmp esi,esp 

    00311458 call @ILT+320(__RTC_CheckEsp) (3你的问题应该就是不明白为什么这句 printf("%d","these">"that");打印的是1吧,因为这里他比较的是地址,你先声明了"that"常量(注意这个地址是字符串常量的地址,不是char数组的地址),所以他的地址在前,后边的strcmp是逐个比对字符直到出现'\0'或者不同字符为止,e大于a所以these和that strcmp返回1,最后一个打印比较的还是地址,string1的地址较小,而且那个if比较的也是地址,因为声明的先后顺序,返回1

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯