user-0 提问: 逆向输出，结果是乱码，求助

回复:
user: user-0
content: 引用 5 楼 user-1 的回复:[quote=引用 4 楼 u014008391 的回复:] [quote=引用 3 楼 user-1 的回复:] [quote=引用 2 楼 u014008391 的回复:]  还没有学到memset这个函数…… 感谢大神解答了unsigned i这个点 另外就是使用int后，逆向输出仍然有乱码。我知其然不知其所以然。不知道函数传递过去后为什么null后面有了内容。  不会吧，这两段代码都还会有乱码吗？我自己试过的，没问题的。你试试我贴的这两段代码看看？[/quote] 您的代码没有问题。我把我的代码unsigned i改成int后仍然有乱码，我认为问题出在null后的内存里有内容。不知道函数传递过去后为什么null后面有了内容。[/quote] 不是传递的问题。你开的字符数组str[100]是局部变量，申请了空间之后，里面的值还都是随机值，并不是你认为的都是0。比如说，你要输入的内容是abc，在未进行memset前，你以为你的str中的存储情况是 a b c  \0 后面96个0 而实际上str中的情况可能是： a b c \0 后面96个随机值（也有可能是0，也有可能是任意值，字符，符号，数字都有可能） 恰巧你用的是      int i =99;//为字符串str创建足够长度      while (!str[i]) i--;     //找到字符串str输入的最后一位； 来判断输入的字符串的最后一位，那这96个字符中只要不是0的，就被你的程序认为是最后一位了，然后倒序输出。这样就产生乱码了。 所以这里需要在使用str之前，先对str进行初始化操作memset(str,0,sizeof(str));将str中的每一位都初始化为0，这样你的程序倒序查找到的才是真正的输入字符串的最后一位。 另外，如果你用strlen(str)，那么该函数就告诉你str数组的长度，那么你就直接找到了str数组的最后一位是str[len-1]，所以你就可以用如下的方式来完成倒序输出，也不会有乱码      int len = strlen(str);      for(i = len-1; i >=0; i--) putchar(str[i]);      putchar('\n');  没学到memset没关系，可以baidu一下看看，学个函数还是很快的。[/quote]  非常感谢老师

user: user-1
content: 引用 2 楼 u014008391 的回复:还没有学到memset这个函数…… 感谢大神解答了unsigned i这个点 另外就是使用int后，逆向输出仍然有乱码。我知其然不知其所以然。不知道函数传递过去后为什么null后面有了内容。  不会吧，这两段代码都还会有乱码吗？我自己试过的，没问题的。你试试我贴的这两段代码看看？

user: user-1
content: 引用 4 楼 u014008391 的回复:[quote=引用 3 楼 user-1 的回复:] [quote=引用 2 楼 u014008391 的回复:]  还没有学到memset这个函数…… 感谢大神解答了unsigned i这个点 另外就是使用int后，逆向输出仍然有乱码。我知其然不知其所以然。不知道函数传递过去后为什么null后面有了内容。  不会吧，这两段代码都还会有乱码吗？我自己试过的，没问题的。你试试我贴的这两段代码看看？[/quote] 您的代码没有问题。我把我的代码unsigned i改成int后仍然有乱码，我认为问题出在null后的内存里有内容。不知道函数传递过去后为什么null后面有了内容。[/quote] 不是传递的问题。你开的字符数组str[100]是局部变量，申请了空间之后，里面的值还都是随机值，并不是你认为的都是0。比如说，你要输入的内容是abc，在未进行memset前，你以为你的str中的存储情况是 a b c  \0 后面96个0 而实际上str中的情况可能是： a b c \0 后面96个随机值（也有可能是0，也有可能是任意值，字符，符号，数字都有可能） 恰巧你用的是      int i =99;//为字符串str创建足够长度      while (!str[i]) i--;     //找到字符串str输入的最后一位； 来判断输入的字符串的最后一位，那这96个字符中只要不是0的，就被你的程序认为是最后一位了，然后倒序输出。这样就产生乱码了。 所以这里需要在使用str之前，先对str进行初始化操作memset(str,0,sizeof(str));将str中的每一位都初始化为0，这样你的程序倒序查找到的才是真正的输入字符串的最后一位。 另外，如果你用strlen(str)，那么该函数就告诉你str数组的长度，那么你就直接找到了str数组的最后一位是str[len-1]，所以你就可以用如下的方式来完成倒序输出，也不会有乱码      int len = strlen(str);      for(i = len-1; i >=0; i--) putchar(str[i]);      putchar('\n');  没学到memset没关系，可以baidu一下看看，学个函数还是很快的。

user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 u014008391 的回复:]  还没有学到memset这个函数…… 感谢大神解答了unsigned i这个点 另外就是使用int后，逆向输出仍然有乱码。我知其然不知其所以然。不知道函数传递过去后为什么null后面有了内容。  不会吧，这两段代码都还会有乱码吗？我自己试过的，没问题的。你试试我贴的这两段代码看看？[/quote] 您的代码没有问题。我把我的代码unsigned i改成int后仍然有乱码，我认为问题出在null后的内存里有内容。不知道函数传递过去后为什么null后面有了内容。

user: user-0
content: 引用 1 楼 user-1 的回复:第一，如果按照你的代码的判断逻辑，那么对str数组要进行memset(str,0,sizeof(str));才能确保你put_string中的判断能够成立； 第二，你在put_string中声明了unsigned i;而后面的判断for (;i>=0;i--)又以i>=0终止条件，这个条件是永远成立的了。。。 根据你的逻辑，修改后的代码如下#include <stdio.h> #include<string.h>    // 倒序显示字符串(不换行) void put_string(const char str[]) {      int i =99;//为字符串str创建足够长度      while (!str[i]) i--;     //找到字符串str输入的最后一位；       for (;i>=0;i--)        //字符串str最后一位开始显示到第一位；          {putchar(str[i]);} }  int main(void) {     char str[100];     memset(str,0,sizeof(str));     printf("请输入字符串：");     scanf("%s", str);      put_string(str);     putchar('\n');      return (0); }  其实有个函数strlen，就可以取得字符串数组的长度，代码就明了多了#include <stdio.h> #include<string.h>  // 倒序显示字符串(不换行) void put_string(const char str[]) {     int i;      int len = strlen(str);      for(i = len-1; i >=0; i--) putchar(str[i]);      putchar('\n'); }  int main(void) {     char str[100];     memset(str,0,sizeof(str));     printf("请输入字符串：");     scanf("%s", str);      put_string(str);     putchar('\n');      return (0); }  引用 1 楼 user-1 的回复:第一，如果按照你的代码的判断逻辑，那么对str数组要进行memset(str,0,sizeof(str));才能确保你put_string中的判断能够成立； 第二，你在put_string中声明了unsigned i;而后面的判断for (;i>=0;i--)又以i>=0终止条件，这个条件是永远成立的了。。。 根据你的逻辑，修改后的代码如下#include <stdio.h> #include<string.h>  // 倒序显示字符串(不换行) void put_string(const char str[]) {      int i =99;//为字符串str创建足够长度      while (!str[i]) i--;     //找到字符串str输入的最后一位；       for (;i>=0;i--)        //字符串str最后一位开始显示到第一位；          {putchar(str[i]);} }  int main(void) {     char str[100];     memset(str,0,sizeof(str));     printf("请输入字符串：");     scanf("%s", str);      put_string(str);     putchar('\n');      return (0); }  其实有个函数strlen，就可以取得字符串数组的长度，代码就明了多了#include <stdio.h> #include<string.h>  // 倒序显示字符串(不换行) void put_string(const char str[]) {     int i;      int len = strlen(str);      for(i = len-1; i >=0; i--) putchar(str[i]);      putchar('\n'); }  int main(void) {     char str[100];     memset(str,0,sizeof(str));     printf("请输入字符串：");     scanf("%s", str);      put_string(str);     putchar('\n');      return (0); }  还没有学到memset这个函数…… 感谢大神解答了unsigned i这个点 另外就是使用int后，逆向输出仍然有乱码。我知其然不知其所以然。不知道函数传递过去后为什么null后面有了内容。

user: user-1
content: 第一，如果按照你的代码的判断逻辑，那么对str数组要进行memset(str,0,sizeof(str));才能确保你put_string中的判断能够成立； 第二，你在put_string中声明了unsigned i;而后面的判断for (;i>=0;i--)又以i>=0终止条件，这个条件是永远成立的了。。。 根据你的逻辑，修改后的代码如下#include <stdio.h> #include<string.h>  // 倒序显示字符串(不换行) void put_string(const char str[]) {      int i =99;//为字符串str创建足够长度      while (!str[i]) i--;     //找到字符串str输入的最后一位；       for (;i>=0;i--)        //字符串str最后一位开始显示到第一位；          {putchar(str[i]);} }  int main(void) {     char str[100];     memset(str,0,sizeof(str));     printf("请输入字符串：");     scanf("%s", str);      put_string(str);     putchar('\n');      return (0); }  其实有个函数strlen，就可以取得字符串数组的长度，代码就明了多了#include <stdio.h> #include<string.h>  // 倒序显示字符串(不换行) void put_string(const char str[]) {     int i;      int len = strlen(str);      for(i = len-1; i >=0; i--) putchar(str[i]);      putchar('\n'); }  int main(void) {     char str[100];     memset(str,0,sizeof(str));     printf("请输入字符串：");     scanf("%s", str);      put_string(str);     putchar('\n');      return (0); }