一道简单的C语言题

本文分析了一段C语言程序,通过详细解释strcpy与strlen函数的行为,特别是在遇到特殊字符时的工作方式,展示了如何理解字符串处理中的潜在陷阱。

看一下下面的一段简单的C语言程序,它的输出结果是多少:

#include<stdio.h>
#include<string.h>

int main()
{
    int a=257;
    char buf[5] = "aaaa";
    strcpy(buf ,(char*)&a);
    printf("%d\n",strlen(buf));
    return 0;
}

分析:257用二进制表示为:000100000001,用16进制表示为:0x00000101,因为一个字节可以存两个16进制,所以在内存中的是1 1 0 0...。buf在内存中的应该以"aaaa\0"来存储,形式是 65 65 65 65 00。

(char*)&a:即把a转换成char类型的指针,此时a指向整形的四个字节中的第一个字节,如图:


strcpy的功能:即:将a指向的内容依次拷贝到buf指向的内容中去,a指向的内容遇到空字符,然后停止。依次只有当a遇到'00'的时候就会停止了,二进制00(要连续两个0)在ascii表中就是‘/0’,只会将'01'/'01'/'00'依次拷贝到buf[0]/buf[1]/buf[2]中去,buf就会变成这样:


然后回到题目中:strlen(buf)很明显结果为2,因为buf[2]='00',strlen遇到它就停止计算(主要的bug就是strcpy和strlen在遇到连续两个0=‘/0’时会停止,依次buf[2]前只有两个字符。差不多了,可以得出结论输出为2了。当然这是在小端机器上的结果,如果对于大段存储的机器,那么得到的结果strlen(buf)就是0了。


### 中级 C 语言代码:实现字符串的逆序输出,并去除其中的重复字符 #### 目描述 编写一个 C 语言程序,实现以下功能: 1. 从用户输入中读取一个字符串。 2. 将该字符串逆序。 3. 去除逆序后字符串中的重复字符。 4. 输出处理后的字符串。 #### 代码实现 ```c #include <stdio.h> #include <string.h> // 函数用于逆序字符串 void reverseString(char *str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - i - 1]; str[len - i - 1] = temp; } } // 函数用于去除字符串中的重复字符 void removeDuplicates(char *str) { int len = strlen(str); if (len < 2) return; int index = 0; for (int i = 0; i < len; i++) { int j; for (j = 0; j < i; j++) { if (str[i] == str[j]) { break; } } if (j == i) { str[index++] = str[i]; } } str[index] = '\0'; } int main() { char input[100]; printf("请输入一个字符串: "); scanf("%s", input); // 逆序字符串 reverseString(input); // 去除重复字符 removeDuplicates(input); // 输出处理后的字符串 printf("处理后的字符串: %s\n", input); return 0; } ``` #### 代码解释 1. `reverseString` 函数:该函数接受一个字符串作为参数,通过交换字符串首尾字符的方式将字符串逆序。 2. `removeDuplicates` 函数:该函数接受一个字符串作为参数,通过双重循环遍历字符串,去除其中的重复字符。 3. `main` 函数:从用户输入中读取一个字符串,调用 `reverseString` 函数将字符串逆序,再调用 `removeDuplicates` 函数去除重复字符,最后输出处理后的字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值