C语言代码中第二次printf无输出的原因咨询
问题分析与修复方案
你的代码存在两个关键问题,直接导致了不符合预期的输出:
1. strcmp 判断逻辑完全颠倒
strcmp 函数的返回规则是:
- 两个字符串相等时,返回
0 - 两个字符串不等时,返回非0值
你当前的判断条件 if(strcmp(s1,s2)) 相当于“当字符串不等时执行分支”,但实际上 s1 和 s2 初始内容完全相同,所以会进入 else 分支,输出错误的sirurile sunt diferite。
2. 向字符串常量写入触发未定义行为
char *s1="abcd"; 中,s1 指向的是存储在只读数据段的字符串常量,这块内存不允许被修改。而你执行 strcpy(s1,s2); 时,试图把 s2 的内容复制到 s1 指向的只读区域,这属于非法操作,会触发未定义行为——程序可能直接崩溃、跳过后续代码,这就是第二个 printf 没有执行的原因。
修复后的代码
#include <stdio.h> #include<string.h> int main(void){ // 将s1改为可写的字符数组 char s1[30] = "abcd"; char s2[30] = "abcd"; // 修正strcmp的判断逻辑 if(!strcmp(s1,s2)){ printf("sirurile sunt identice\n"); }else{ printf("sirurile sunt diferite\n"); } strcpy(s2,s1); printf("%s\n",s1); strcpy(s1,s2); printf("%s\n",s2); return 0; }
修复说明:
- 把
char *s1="abcd";改为char s1[30] = "abcd";,让s1指向栈上的可写内存区域,strcpy操作合法。 - 用
!strcmp(s1,s2)反转判断逻辑,确保字符串相等时执行正确分支。
内容的提问来源于stack exchange,提问作者Haxel
相关产品推荐
相关产品推荐

