C語言,字串反轉,為什麼輸出有時候會出現亂碼

2021-05-22 18:13:34 字數 6288 閱讀 8570

1樓:匿名使用者

在for迴圈外面需要加一句str1[len] = '\0';表示字串結束。

因為你只複製了0到len-1的字元,最後一個\0沒有複製。

2樓:2b丶xiao年輕

因為你反轉後在字串末尾沒有加\0

c語言,字串輸出是亂碼

3樓:圈圈叉叉叉叉圈

字串使用前請使用清空語句把垃圾記憶體清理成'\0',也就是0x00(0):

memset(str2, 0x00, sizeof(str2));

當然,也可以在宣告的時候進行初始化:

char str2[20] = ;

這句也能實現同樣的效果。這是c語言習慣,務必養成!

'\0'是字串結束符,每當直譯器看到這'\0'才會認為字串終止,而你的程式明顯沒有字串結束符,所以連同垃圾記憶體一起讀出來了。「燙燙。。」等就是垃圾記憶體。

不明白歡迎追問

4樓:

struct s p[4];只是宣告瞭一個名為p的struct s型陣列,還沒有為其賦值,裡面全是機器垃圾,你就用for(i=0;...)printf...輸出,能得到正常資料嗎?

都是垃圾,當然是亂碼!另:全域性陣列p的中是4,=右邊卻用5個元素初始化,越界了!!

5樓:自戀狂

你幾個地方寫錯了,我在裡面有註釋,分別有:

1、賦值地方,應該是a[i][j],這裡i、j代表第幾個,你用student這些固定值,一看就知道錯了不是嗎?而且這是個非常嚴重的錯誤,a[i][j]這裡面i不能等於student,j不能等於subiects,你們下標取值0到student-1,你自己寫完看看都知道錯了

2、sum每次迴圈前要賦0,否則會把前一個學生的成績加進去

3、ave=sum*1.0/4,不乘1.0的話,系統會把sum/4當成一個整型,會造成結果不正確

#include

#define subiects 3 //學科數量

#define students 4 //學生人數

int main(void)

;int i = 0, j = 0, sum = 0;//sum為總分

double ave;//ave為平均值

//輸入成績

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

}//輸出成績

printf("\t\tc語言\t大英\t高數\t總分\t平均分\n");

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

ave = sum*1.0 / subiects;

printf("\t%d\t%.2f\n",sum,ave);

}printf("\n\n");

//顛倒輸出

sum = 0;

ave = 0;

printf("\t");

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

printf("\t同學%d", i + 1);

printf("\t平均分\n");

for (j = 0; j < subiects; j++)

ave = sum*1.0 / students;

printf("\t%.2f\n",ave);

}return 0;}

6樓:匿名使用者

主要錯誤有三個,第一:後面所有的a[students][subiects]變成a[i][j]

在計算每個同學的總分和平均分的時候要將sum的初值設定為0吧

在計算平均分的時候,你的語句是ave = sum / students;ave = sum / subiects

這個是不對的,應改為,ave =1.0* sum / students,ave =1.0* sum / subiects原因在於 假設sum=7,students=3,則ave=7/3=2,而實際想要的結果為2.

3333

#include

#define subiects 3  //學科數量

#define students 4  //學生人數

int main(void)

;int i = 0, j = 0, sum = 0;//sum為總分

double ave;//ave為平均值

//輸入成績

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

}//輸出成績

printf("\t\tc語言\t大英\t高數\t總分\t平均分\n");

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

ave = 1.0*sum / subiects;

printf("\t%d\t%.2f\n",sum,ave);

}printf("\n\n");

//顛倒輸出

sum = 0;

ave = 0;

printf("\t");

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

printf("\t同學%d", i + 1);

printf("\t平均分\n");

for (j = 0; j < subiects; j++)

ave = 1.0*sum / students;

printf("\t%.2f\n",ave);

}return 0;}

7樓:

#include

#include

#include

int random(int num);

void main()

printf("請依次輸入學生姓名:");

for(i=0;i被點到的同學的名字是:");

printf("%s ",p[random(n-1)]);

}int random(int num)

8樓:匿名使用者

你好沒有亂碼

就是邏輯上有些錯誤如圖:

9樓:匿名使用者

按照程式是在a字元

串中隔一個字元取一個形成b字串

void main()

half(a);

}輸出24680bdfhj

如果出亂碼,可能你的a陣列賦值方面有問題,不知道你是如何定義a陣列和呼叫函式的

10樓:匿名使用者

輸出亂碼是必須的,

因為你的資料型別搞錯了,

你使用的是字元函式stringcopy()來拷貝字元;

那麼要處理的資料當是char型別,

然而你所定義的指標應當也是char型別;

你應當修改的地方是

int *str1,*str2;//請將int改為char

11樓:匿名使用者

沒什麼問題,第一個for迴圈後多了一個分號;只要保證你傳入該函式的陣列a中有準確的二十個字元就行,如:char a=;

12樓:

while(1)

else }

13樓:匿名使用者

把讀迴圈改為 : while(fgets(str,120,fp) != null) printf("%s\n",str);

這樣就不需要直接檢查檔案是否結束,這是因為fgets()函式在讀滿120個字元或遇到'\n'時,就返回str的首址。在讀檔案時,測試是否到檔案結束經常出錯,我看見高手們都很少使用feof();函式,原因大概在此吧!

14樓:匿名使用者

原因向他們說的那樣, char a是一個區域性變數, 函式返回後他在棧上的空間就自動釋放了...

可以這樣改下:

#include

#include

#include

#include

using namespace std;

#define max_len 10

char* getnick()

return a;

}void main()

15樓:匿名使用者

getnick函式內的陣列a是區域性陣列,在棧上分配空間``,當getnick執行完後,棧空間會被**

可把a定義為全域性變數或動態申請空間(在堆中分配空間)

16樓:匿名使用者

getnick 返回的a,是一個區域性變數,當getnick返回後,這個變數就無效了,這個變數所指記憶體中的內容變得不可**,列印出來的當然不行了。你要麼把 a 宣告在函式外面,作一個全域性變數,要麼在getnick裡

static char a = ....;

17樓:匿名使用者

你的 str2 沒有加結束字元

加上 str2[n] = '\0';

就能濾掉後面的亂碼了

18樓:匿名使用者

if( !(file = fopen(name, "wb")))

你是以二進位制的方式開啟檔案的,用「w+」吧: fopen(name, "w+")

19樓:匿名使用者

#include

int main()

str2[n]='\0';

}puts(str2);

putchar('\n');

return 0;

}就是 str2 的結束加上結束符『\0』

20樓:郭城仉嘉容

intm[i];

改成int

m[i]=;

試下因為m字串有可能沒有初始化,最後沒有終結符,造成最後幾個字元隨機記憶體值亂碼。

c語言 字串輸出時最後出現亂碼

21樓:匿名使用者

輸出出現亂碼就是因為字串結尾並沒有結尾符'\0'。

gets函式讀入一行字串時,會在最末尾自動加上'\0'結尾。但是你在for迴圈內將s2的字元一個個拷貝到s中的時候,迴圈限定條件只到了s2字串的'\0'結尾符之前,所以輸出亂碼了。

將迴圈條件k

22樓:匿名使用者

#include

#include

int main()

{ int a,b,k;

char s1[1000],s2[1000],ex;

gets(s1);

gets(s2);

a=strlen(s1);

b=strlen(s2);//計算字串長度//char s[a+b+1];

memcpy(s,s1,a);//把s1放入s中//for(k=a;k

c語言,字串輸出是亂碼是怎麼回事?

23樓:圈圈叉叉叉叉圈

字串使用前請使用清空語句把垃圾記憶體清理成'\0',也就是0x00(0):

memset(str2, 0x00, sizeof(str2));

當然,也可以在宣告的時候進行初始化:

char str2[20] = ;

這句也能實現同樣的效果。這是c語言習慣,務必養成!

'\0'是字串結束符,每當直譯器看到這'\0'才會認為字串終止,而你的程式明顯沒有字串結束符,所以連同垃圾記憶體一起讀出來了。「燙燙。。」等就是垃圾記憶體。

不明白歡迎追問

c語言 字串輸出時最後出現一個亂碼 **等

24樓:一粟滄海

是你的for (i = 0; i <= len; i++),多輸出了一個字元,改成for (i = 0; i < len; i++)即可,記住c中陣列都是從0開始數的。

25樓:匿名使用者

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

兩個這個地方都要寫成 < 不能等於

26樓:鑄信

修改這裡:len = strlen(cs)-1;

27樓:利芳懿邶豆

因為你的字串陣列錯誤的引用了存在髒資料的記憶體要避免,就要初始化陣列

memset(str,0,n)

將str字串中前n個位元組替換為0並返回str;

str為你定義的字串,n為字串容量,並非長度,即chara[20],不管你有幾個字元,n為20為佳加上標頭檔案string.h

****華夏聯盟,親

用c語言寫字串逆序輸出,用C語言寫 字串逆序輸出

逆序輸出有很多種,具體的實現方法取決於你題目的要求 1.如果只是要求逆序輸出,那麼可以採用類似的方法 void reverse char s 這種方法在s很長的情況下會一直遞迴到底,不是很好。2.如果需要將字串整個逆序在函式外面輸出,那麼可能希望採用返回字串指標的方式 實現如下 char rever...

C語言關於子函式,輸入字串逆序輸出,輸出了但是有很多燙,我覺得應該初始化了陣列

user code begin 考zhi生在此後完成自定義函dao 數的專設計,行數不限 void zhuanhuan char str for i 0 i 你想 bai得太復 du雜了zhi 吧,逆dao 序輸出版而已權 include include string.h void main voi...

為什麼c語言scanf函式對字串不要加 取地址運算子

c語言的字串為陣列形式,而陣列的名稱可以表示其地址,故對字串輸入不需要加地址符。而單獨的字元 整型變數等的名稱不能直接表示地址,故需要加地址符。資料型別 字串資料型別是建模在形式字串的想法上的資料型別。字串是幾乎在所有程式語言中可以實現的非常重要和有用的資料型別。在某些語言中它們可作為基本型別獲得,...