c语言读出的字符串都是烫怎么办,C语言出现“烫”字符的内存分析

好像这里看不到图片,我的原文发表在QQ空间了,http://user.qzone.qq.com/247975076/2,可以看到原文

近来看网上好评颇高的

C++

反汇编与逆向技术揭秘一书,结合以前看过的零零散散的知识,对比印证,收获颇多,联想起大学时候刚学

C

语言时候碰到输出字符串时偶尔会输出‘烫’字符的异常情况时百思不得其解的情况,于是就写了这个小文章,希望可以解开一些C语言初学者的疑惑。

几个基础知识

1:栈的定义

栈是一种先进后出的存储方式,在C等高级语言里面,是通过数据结构来实现的,而汇编则可以使用,将数据压入其中,比如push,pop指令。

2:16位汇编与32位汇编区别

在80386之前,intel处理器一般是16位寄存器,20位地址线,因为有20位地址线,所以可以寻址的最大范围就是2的20次方,就是1M,但是因为数据线的地址是寄存器传过来的,也就造成了肚子大,口径小的问题,16和20不匹配,所以大学时候学的基本都是16位汇编,段地址+偏移地址,组合成20位地址,而在80386之后,地址线迅速跃升为32位,存储器也变成32位,这样,工作在保护模式时候,可以寻址2的32次方地址空间,也就是4G。(搞不懂实模式和保护模式区别的可以去百度,涉及到intel芯片的发展历史问题···)

所以,如果我们打开反汇编器,就会看到这样一个东西

0818b9ca8b590ca3270a3433284dd417.png

前面的004010C0就是地址,这个是十六进制,懂得进制转换的都知道,一个十六进制可以转换为4个二进制,比如0xC=1100

所以004010c0换算成二进制就是8*4=32位

3:lea  rep   stos  jg等基本汇编指令,百度吧···

好吧,下面我们就开始用VC6.0的反汇编引擎来进行分析吧···

C代码如下

int main()

{

int i;

char a[20];

gets(a);

for( i=0;i<20;i++)

{

printf("%c",a[i]);

}

return 0;

}

关于ma

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是使用C语言在main函数中创建一个文件,将字符串m写入文件中,并读取文件中的所有字符串,并找到其中最长的一个字符串并保存到另一个文件中的示例代码: ```c #include <stdio.h> #include <string.h> int main() { char m[] = "Hello World!"; FILE *fp; fp = fopen("example.txt", "w"); fputs(m, fp); fclose(fp); fp = fopen("example.txt", "r"); char str[100]; char max_str[100]; int max_len = 0; while(fgets(str, 100, fp) != NULL) { printf("%s", str); int len = strlen(str); if(len > max_len) { max_len = len; strcpy(max_str, str); } } fclose(fp); fp = fopen("max_str.txt", "w"); fputs(max_str, fp); fclose(fp); return 0; } ``` 这个程序创建了一个名为“example.txt”的文件,并将字符串“Hello World!”写入该文件中。然后,程序读取该文件中的所有字符串,并找到其中最长的一个字符串,并将其保存到另一个名为“max_str.txt”的文件中。 ### 回答2: 使用C语言在main函数中创建一个文件,并将m个字符串写入该文件的方法如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char **strings; // 声明一个字符串数组 int m; // 字符串的个数 FILE *file; int i; printf("请输入要写入的字符串个数m:"); scanf("%d", &m); strings = (char **)malloc(m * sizeof(char *)); // 分配字符串数组的内存 // 获取m个字符串 for (i = 0; i < m; i++) { char *str; int len; printf("请输入第%d个字符串:", i + 1); scanf("%d", &len); str = (char *)malloc((len + 1) * sizeof(char)); // 分配字符串内存 scanf("%s", str); strings[i] = str; } // 将字符串写入文件 file = fopen("data.txt", "w"); if (file == NULL) { printf("无法创建文件!\n"); return 1; } for (i = 0; i < m; i++) { fputs(strings[i], file); fputc('\n', file); // 每个字符串后面加入换行符 } fclose(file); // 读取文件并找出最大的一个字符串 file = fopen("data.txt", "r"); char *maxString = (char *)malloc(100 * sizeof(char)); // 假设最大字符串长度不超过100 char str[100]; int maxLength = 0; while (fgets(str, 100, file) != NULL) { int len = strlen(str); if (len > maxLength) { maxLength = len; strcpy(maxString, str); } } fclose(file); // 将最大的一个字符串保存到另一个文件 file = fopen("max_string.txt", "w"); if (file == NULL) { printf("无法创建文件!\n"); return 1; } fputs(maxString, file); fclose(file); printf("成功创建文件并完成写入和读取操作!\n"); // 释放内存 for (i = 0; i < m; i++) { free(strings[i]); } free(strings); free(maxString); return 0; } ``` 以上代码通过动态分配内存创建一个字符串数组,获取m个字符串并写入名为"data.txt"的文件中。然后,在读取该文件时找出最长的字符串,并将其保存到名为"max_string.txt"的另一个文件中。最后,释放分配的内存并结束程序。 ### 回答3: 在C语言中可以使用标准库函数来完成创建文件、写入字符串和读取字符串的操作。以下是一个示例代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> void findMaxString(char* filename1, char* filename2, int m) { FILE* file1 = fopen(filename1, "w"); // 创建文件 if (file1 == NULL) { printf("无法创建文件!\n"); return; } // 写入m个字符串到文件 for (int i = 0; i < m; i++) { char string[100]; printf("请输入第%d个字符串:", i + 1); scanf("%s", string); fprintf(file1, "%s\n", string); } fclose(file1); FILE* file2 = fopen(filename1, "r"); // 打开文件 if (file2 == NULL) { printf("无法打开文件!\n"); return; } char maxString[100]; while (!feof(file2)) { // 读取所有字符串 char string[100]; fgets(string, 100, file2); if (strlen(string) > strlen(maxString)) { // 找出最大的字符串 strcpy(maxString, string); } } fclose(file2); FILE* file3 = fopen(filename2, "w"); // 创建新文件 if (file3 == NULL) { printf("无法创建文件!\n"); return; } fprintf(file3, "%s", maxString); // 将最大字符串保存到新文件 fclose(file3); printf("最大的字符串已保存到文件:%s\n", filename2); } int main() { char filename1[50]; char filename2[50]; int m; printf("请输入要创建的文件名:"); scanf("%s", filename1); printf("请输入要保存最大字符串的文件名:"); scanf("%s", filename2); printf("请输入要写入的字符串个数:"); scanf("%d", &m); findMaxString(filename1, filename2, m); return 0; } ``` 以上代码实现了在`main`函数中创建一个文件并写入`m`个字符串。然后打开该文件,读取所有字符串,并找出最大的一个字符串。最后将最大字符串保存到另一个文件中。用户需要在运行程序时输入文件名和字符串个数。最终结果会打印在屏幕上,并保存到指定的文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值