我有這個名為檔案的c 可執行testFile檔案,其中包含以下代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
printf("Number of arguments : %d\n Arguments : ", argc);
for(int i = 0; i<argc-1;i ){
printf("%s\t", argv[i]);
}
}
以及一個名為test1僅包含數字 1 ( echo 1 > test1)
的檔案
當我在命令列 ( zsh) 上呼叫此行時:
./test < test1
我得到的輸出是:
Number of arguments : 1
Arguments : ./testFile
這不應該顯示 2 個論點嗎?與字符 1 一起?我想找到一種方法讓這個 1 出現在引數串列中,有可能嗎?或者它只是我的外殼處理這樣傳遞的引數的方式?(我覺得cat < test1列印很奇怪1)
uj5u.com熱心網友回復:
您將標準輸入與命令引數混為一談。
main和用于傳遞命令列引數argc。argv
例如,在這里,shellecho使用 1 個命令列引數(1字符)呼叫,并將其標準輸出附加到新打開和截斷的檔案test。
echo 1 > test1
這里,shelltest以 0 個引數運行,其標準輸入附加到一個新打開的test1檔案。
./test < test1
如果你想把 的內容./test1變成命令列引數test,你可以用xargs.
xargs test < test1
與您的問題無關:
for(int i = 0; i<argc 1;i ){
條件應該是i<argc。像 C 和幾乎所有其他語言中的所有陣列一樣,最小有效索引argv為 0,最大有效索引比其長度小 1。正如評論者指出的那樣,argv[argc]必須為 NULL,因此從技術上講,argc它比argv.
uj5u.com熱心網友回復:
如果您希望 的內容在test1中可用argv,您可以執行以下操作:
./test $(cat test1)
請注意,這與:
./test "$(cat test1)"
這也不同于:
./test '$(cat test1)'. # Does not do at all what you want!
第一個選項將檔案的每個“單詞”作為不同的引數呈現,而第二個選項將檔案的內容作為單個引數呈現。單引號版本根本不查看檔案內部,僅包含在此處以供您嘗試。
uj5u.com熱心網友回復:
argv[0]始終是可執行檔案本身的名稱。使用您呼叫命令的方式,您根本沒有傳遞任何命令。您必須從 zsh 呼叫它,就./testFile test1好像您希望您的程式看到資料檔案的名稱,或者 ./testFile $(<test1)如果您希望它看到資料檔案的內容一樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/512508.html
標籤:CUnixzsh
