概括
我正在嘗試傳遞用戶在終端中輸入的文本并將其傳遞給名為 printString() 的函式。我不完全理解C,但我認為我與指標不在堆中有關。任何幫助將不勝感激!
#include <stdio.h>
void printString();
int main (int argc, char* argv[]) {
int commandAmount = 1;
while (commandAmount < argc) {
printString(commandAmount, &argv);
}
return 0;
}
void printString(int commandAmount, char* argv[]) {
printf("the word is %s," , argv[commandAmount]);
}
./shortExample example
Segmentation fault (core dumped)
uj5u.com熱心網友回復:
原型void printString();與實際實作不匹配。它應該是:
void printString(int commandAmount, char* argv[]);
您也可以跳過原型,只實作之前的功能main。你的回圈while (commandAmount < argc)似乎沒有辦法完成,因為你從來沒有增加commandAmount. 這可能會導致未定義的行為,因此,您的程式可能會崩潰或執行任何操作。我建議制作一個for-loop 來解決這個問題。
例子:
#include <stdio.h>
void printString(int commandAmount, char* argv[]) {
printf("the word is %s,", argv[commandAmount]);
}
int main(int argc, char* argv[]) {
for(int commandAmount = 1; commandAmount < argc; commandAmount) {
printString(commandAmount, argv);
}
}
或以您的結構方式:
#include <stdio.h>
void printString(int commandAmount, char* argv[]); // corrected
int main(int argc, char* argv[]) {
int commandAmount = 1;
while (commandAmount < argc) {
printString(commandAmount, argv);
commandAmount; // needed
}
}
void printString(int commandAmount, char* argv[]) {
printf("the word is %s,", argv[commandAmount]);
}
uj5u.com熱心網友回復:
對于初學者來說,這個函式宣告
void printString();
不提供函式原型。所以編譯器從函式呼叫中判斷函式引數的型別
printString(commandAmount, &argv);
但是&argv,此呼叫中使用的運算式
printString(commandAmount, &argv);
char ***由于識別符號的宣告而具有型別argv
int main (int argc, char* argv[]) {
^^^^^^^^^^^^
但是函式定義中的相應引數printString具有型別char **,因為編譯器將具有陣列型別的引數調整為指向陣列元素型別的指標。
就是這個函式宣告
void printString(int commandAmount, char* argv[]) {
由編譯器調整為
void printString(int commandAmount, char** argv) {
^^^^^^^^^^^
因此,引數運算式和引數的型別不兼容。結果這個電話
printf("the word is %s," , argv[commandAmount]);
呼叫未定義的行為。
此外,這個回圈在 main
int commandAmount = 1;
while (commandAmount < argc) {
printString(commandAmount, &argv);
}
通常是一個無限回圈,因為變數commandAmount在回圈內沒有改變。
首先你應該提供函式原型,main以使你的程式更安全
void printString(int commandAmount, char** argv);
并呼叫函式
printString(commandAmount, argv);
^^^^
當然,您還需要更改 main 中的回圈。
請注意,由于引數的值commandAmount沒有在函式內輸出,實際上它是多余的。您可以將指向字串本身的指標傳遞給函式。例如
#include <stdio.h>
void printString( const char *s );
int main( int argc, char* argv[] )
{
for ( int commandAmount = 1; commandAmount < argc; commandAmount )
{
printString( argv[commandAmount] );
}
putchar( '\n' );
return 0;
}
void printString( const char *s )
{
printf( "the word is %s, " , s );
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/493762.html
上一篇:如何遍歷以數字結尾的元素
