2016-03-21 4 views
0

文字列は、この形式である:文字列から2 intをコピーするにはどうすればよいですか?

123 456\n 

私の基本的な考え方は、forループによって空白を見つけることです:

int i=0; 
for (i=0;isdigit(str[i]);i++){ 
} 
char *dest1; 
strncpy(dest1, str, i-1); 
dest1[i]='\0'; 

そして第二にint型のために、私は再びそれをした:

int j=i+1; 
for (;isdigit(str[j]);j++){ 
} 
char *dest2; 
strncpy(dest2; (str+j); j-i); 
dest2[j-i+1]='\0'; 
int from = atoi(dest1); 
int to = atoi(dest2); 

しかし、私がこれを2回目にしたとき、Xcodeは「関数に似たマクロ呼び出しに引数が少なすぎる」と答えました。& & '表現結果は未使用 'となります。

しかし、彼らはまったく同じ構文です...誰かが私が間違っていたことを教えてください?

+1

そのため、これが定義されていない、 'dest1'または' dest2'を初期化していません。 – EOF

+0

私はそれらを初期化した後もまだ2つのエラーがあります –

+1

もう1つのスニペットで 'strncpy()'の引数の間に ';'の代わりに間違って ';'を使用します。しかし、このコードには、プログラムが未定義の振る舞いをする可能性が高い他の多くの欠陥があります。 – EOF

答えて

0

あなたの方法(固定)

char *str = "123 456\n"; 

int i=0; 
for (i=0; isdigit(str[i]); i++){ 
} 
char dest1[4]; 
strncpy(dest1, str, i); 
dest1[i]='\0'; 

int j=i+1; 
for (;isdigit(str[j]);j++){ 
} 
char dest2[4]; 
strncpy(dest2, str+i+1, j-i-1); 
dest2[j-i-1]='\0'; 
int from = atoi(dest1); 
int to = atoi(dest2); 

マイウェイ

int from, to; 
char *str = "123 456\n"; 

int ret = sscanf(str, "%d %d", &from, &to); 
1

そのための必要はありませんが、あなたの文字列が整数のみを持っている場合は、区切り文字で区切られたトークンを返すstrtok()機能を使用することができますsscanf()

int value; 
int count; 
char *pointer; 
char str[] = "123 456"; 

pointer = str; 
while (sscanf(pointer, "%d%n", &value, &count) == 1) 
{ 
    fprintf(stdout, "%d\n", value); 
    pointer += count; 
} 
+1

数値として解析できない空白以外の文字列が文字列に含まれている場合、最初のバリアントループは無限になりませんか? – EOF

+0

私はあなたが何を意味するかを見ます... –

+0

[strtol()の正しい使い方]を参照してください(https://stackoverflow.com/questions/14176123/correct-usage-of-strtol/14176593?s=2|3.7929# 'strtol()'をより正確に使う方法については、14176593を参照してください。 'sizeof(int)!= sizeof(long)'の場合は、複数の問題があることに注意してください。簡潔に言えば、エラー処理を気にするなら、生の 'strtol()'をインラインで使うことはできません。繊細なチェックをする関数で呼び出す必要があります。エラー処理を気にしなければ、それを取り除くことができますが、代わりに 'atol()'を考慮してください。 –

0

を使用しています。区切り文字に空白を追加することができます。例えば

strtok()だけその最初の呼び出しで文字列を取得することを

123 
456 
789 

注:

#include <string.h> 

char str[] = "123 456 789"; 
char *token; 
int number; 

token = strtok(str, " "); 

for(int i=0; i < 2; i++){ 
    number = atoi(token); 
    printf("%d\n", number); 
    token = strtok(NULL, " "); 
} 

は、これはあなたにこれを印刷します。次に、特定の文字列の終わりまでNULLを使用する必要があります。これは、数えられた(推測された、知っていた)数か、またはstrtok()がNULLポインタを返したためです。

+0

注1)OPの文字列は '' 123 456 \ n "'でした。 2) 'atoi(token);'を使用して 'token!= NULL'を保証せずに' strtok() 'が' NULL'を返すことができるので弱いコードになります。 – chux

関連する問題