1

たとえば「11:12」を入力して「11」と「12」を取り戻すプログラムを作成しました。これは私のコードです:

#include<stdio.h>
#include <string.h>
#include <conio.h>
int main(void)
{
char s[] = "";
char seperator[] = ":";
char *ch;
while (1)
{
scanf("%s", &s); //scanf("%s", &s);
if (s == -1) break;
char *result = NULL;
result = strtok(s, seperator);
while( result != NULL ) {
    printf( "result is \"%s\"\n", result );
    result = strtok( NULL, seperator );
}
fflush(stdout);

}
return 0;
}

しかし、「11:12」と入力すると、これが私の出力になります。

result is "11"
result is "12→ ("

最後の「→(」を取り除くにはどうすればよいですか?

4

3 に答える 3

6

「s」配列にメモリを割り当てていません。このように試してみてください:

char s[128] = "";

さらに、パラメーター&sを使用してscanfで二重間接参照を実行しています。「s」は関数へのパラメーターとしてポインターに減衰されるため、これは必要ありません。このようにしてみてください:

  scanf("%s", s);
于 2012-10-30T18:10:57.297 に答える
3

s長さ0の文字列として定義しています

char s[] = "";

したがって、長さ0の文字列をで読み込んでいるとscanf()、悪いことが起こります。それにいくつかのメモリを割り当てます:

char s[100];

&また、のは必要ありませんscanf()。ただscanf("%s", s)やる。

そして、私たちがそれに取り組んでいる間、これは何をしようとしているのですか?

if (s == -1) break;

それは機能しないので..."-1"が入力されたかどうかを確認したい場合は、strcmpのようなものを使用する必要があります。

if (strcmp(s,"-1") == 0) break;
于 2012-10-30T18:11:23.460 に答える
1

コードの動作は未定義です。

char s[] = "";

この行では、長さが1のcharの配列を宣言しています。これは、事実上nullのみを格納できることを意味します。したがって、入力を読み取ると、オーバーフローsしてUBを呼び出します。

&s配列名はそのアドレスと同じであるため、scanfで削除することもできます。

別の問題は次のとおりです。

if (s == -1) break;

sは配列であるため、アドレスを-1にすることはできません。この比較は意味がありません。

于 2012-10-30T18:13:10.433 に答える