0
char string[50], s[50];
struct stat buf;
int counter = 0;

while (fgets(string, sizeof string, stdin)) {
    if (strspn(string, "size ") == 5) {
        for (int i = 5; i < strlen(string); i++) {
            s[counter] = string[i];
            counter++;
        }
        s[counter] = '\0';

        if (stat(s, &buf) < 0)
            return 1; //PROBLEM OCCURED

        printf("FILE: %s\n", s);
        printf("SIZE: %d\n", (int)buf.st_size);
    }
 }

プログラムのコンテキストはそれほど重要ではありませんが、「サイズ」の後にファイルの名前が唯一の入力であるため、これを使用しようとしています。次に、それを stat に渡します。これは、指定されたファイルが存在する場合、そのファイルのバイト数を提供するはずです。最終的に、統計を間違って使用しているように、プログラムは毎回1を返します。助けてください!

4

2 に答える 2

2

fgets() は末尾の改行文字を返すため、「ファイル名」は決して正しくありません。

交換:

for(int i = 5; i < strlen(string); i++) {
   s[counter] = string[i];
   counter++;
}
s[counter] = '\0';

と:

char *source = &(string[5]), *dest = s;
while((*source != 0) && (*source != 10) && (*source != 13)) {
   *dest++ = *source++;
}
*dest = 0;

このようにして、文字列に CR や LF 文字を追加するのではなく、ゼロ (文字列の終わり)、キャリッジ リターン、またはラインフィードまですべてをコピーします。

于 2012-06-05T00:55:55.360 に答える
0

根本的な問題は strspn() の使用法にあると思います。strspn() の戻り値は、

str1 のすべての文字が str2 にある場合、関数は str1 文字列全体の長さを返し、str1 の最初の文字が str2 にない場合、関数はゼロを返します。

ソース文字列に「サイズ」の比較値が含まれているかどうかを確認できます。

参照してください

于 2012-06-05T01:09:44.380 に答える