在c語言中用scanf取地址給一個字符變數賦值,為什么可以正確輸出但不能正確使用strcmp函式
uj5u.com熱心網友回復:
字串操作要求 0 結尾這里沒0
錯
uj5u.com熱心網友回復:
這個程式是正確的,但為什么不能代入用strcmp函式
uj5u.com熱心網友回復:
#include <string.h>
#include <stdio.h>
int main()
{
int i, findFlag=0;
char x;
char str[][13]={ "Pascal","Basic","Fortran", "Java", "Visual C", "Visual Basic" };
findFlag=0;
printf("請輸入一個字串:");
scanf("%s",&x);
i=0;
while (i<6 && !findFlag)
{
if (strcmp(&x,str[i])==0)
{
findFlag = 1;
}
i++;
}
if (findFlag)
{
puts(&x);
}
else
{
printf("沒找到!\n");
}
return 0;
}
uj5u.com熱心網友回復:
VC++6.0,我的最愛,沒有之一#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int i, findFlag=0;
char x[13] = {0};//---------改成字符陣列,即字串--------
char str[][13]={ "Pascal","Basic","Fortran", "Java", "Visual C", "Visual Basic" };
findFlag=0;
printf("請輸入一個字串:");
scanf("%s",&x);
i=0;
while (i<6 && !findFlag)
{
if (strcmp(x,str[i])==0)//-------改成x,即字串首地址-----------
{
findFlag = 1;
}
i++;
}
if (findFlag)
{
puts(x);//-------改成x,即字串首地址-----------
}
else
{
printf("沒找到!\n");
}
return 0;
}
除錯結果
uj5u.com熱心網友回復:
輸入成功就是 陣列越界 GG
uj5u.com熱心網友回復:
它既然可以輸出字串,為什么不能直接用strcmp函式,而要定義一個陣列,我發的那個程式有的輸出結果是對的,有的是錯的,不懂原因uj5u.com熱心網友回復:
這個程式屬于危險程式,輸入的字串如果超過了x的記憶體長度會造成記憶體越界,當然因為例子中程式,記憶體越界不造成影響,所以能正確運行,但如果在后面加上strcmp函式呼叫,函式呼叫入堆疊前的記憶體地址資訊就被破壞,導致函式呼叫后回傳不到正確的記憶體地址,所以出錯。uj5u.com熱心網友回復:
這個程式屬于危險程式,輸入的字串如果超過了x的記憶體長度會造成記憶體越界,當然因為例子中程式,記憶體越界不造成影響,所以能正確運行,但如果在后面加上strcmp函式呼叫,函式呼叫入堆疊前的記憶體地址資訊就被破壞,導致函式呼叫后回傳不到正確的記憶體地址,所以出錯。
那如果沒超過它的存盤范圍那是不是可行的
uj5u.com熱心網友回復:
沒超過是可以的,但是你只要輸入1個字符就會超,因為字串還有個結尾符‘\0’關于這種記憶體越界,你可以谷歌百度一下函式堆疊資訊以及函式呼叫程序的堆疊管理,這樣你就知道記憶體越界到什么位置會破壞什么樣的堆疊資訊。
uj5u.com熱心網友回復:
沒超過是可以的,但是你只要輸入1個字符就會超,因為字串還有個結尾符‘\0’
關于這種記憶體越界,你可以谷歌百度一下函式堆疊資訊以及函式呼叫程序的堆疊管理,這樣你就知道記憶體越界到什么位置會破壞什么樣的堆疊資訊。
好噠感謝啦
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/119978.html
標籤:C語言
