3

I'm trying to ask the user to type in a string so I will print the length of the string. My code is built succeeded. However, when I entered a word and pressed 'enter', the program keeps running. I had to enter a second word, then the length of the first string displays. I'm confused at argv[1]. Can someone give me some tips and hint on how to fix this? Thanks in advance for your time.

Please note that I'm not allowed to use any string function.

   int main(int argc, char* argv[]){

    char* s=argv[1];

    char input[256];
    s = input;
    printf("Please enter a string: ");
    scanf("%s\n", s);
    int str_length = 0;
    while (s[str_length] != '\0')
    {
        str_length++;
        if (s[str_length] == '\0') break;
    }

    printf("%d\n", str_length);


    return 0;   
}
4

4 に答える 4

6

argv[]はコマンド ライン パラメータを保持する配列です。argv[1]は最初の配列です (argv[0]もちろん、コマンド表現自体は除きます)。に割り当ててからsすぐに上書きするsので、ここではあまり必要ありません。

2行入力しなければならない理由\nは、入力形式の最後にあります。改行が続くフォーマット文字列に一致するものは何%s\nでも必要ですscanf

%sそれだけでその問題は修正されますが、入力の完全な行の場合は別の問題が発生します。最初の空白までしか読み取れません。適切なライン入力機能については、こちらを参照してください。

バッファ オーバーフローに対する保護と長すぎる行の検出/クリーンアップを備えた完全な行入力を行いscanf("%s")ます。

さらに、if内のステートメントwhileは、それ自体が文字列の末尾をキャッチするため、ここでは不要であり、両方を使用して同じ配列を参照するwhileことはほとんど意味がありません(ある時点で変更した場合は意味がありますが、そうではありません)。ここで起こっている)。inputss

そのため、高度な line iput 関数を使用しないバリアントは、次のように単純になります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char* argv[]) {
    char input[256];
    int str_length = 0;

    printf ("Please enter a string: ");
    scanf ("%s", input);
    while (input[str_length] != '\0')    /* Or consider using strlen() */
        str_length++;

    printf ("%d\n", str_length);

    return 0;
}

と入力すると、すぐHelloに印刷されることがわかります。また、 を入力したかどうか5もわかります。これは、高度な入力関数を選択する理由の 1 つです (もう 1 つの非常に重要な理由は、プログラムにバッファー オーバーフローの脆弱性を持ち込まないようにするためです)。5Hello Pax

于 2013-04-16T02:34:20.840 に答える
0

行を変更するだけscanfです:

scanf("%s", s);

あなたが持っているように(scanf("%s\n", s);)、それはで終わる一連の文字を必要とし、次に入力がいつ終了したかを示すために\n別の文字を必要とします。\n

于 2013-04-16T02:34:03.137 に答える