• ベストアンサー

修正おねがいします。

コンパイルして得られる実行ファイルを list1 として、 %list1 文字列1 文字列2 ・・・ を実行すると文字列1、文字列2、・・・を連結した一つの文字列を動的に生成した領域に格納し、それをディスプレイ上に表示するプログラムを作成しようと思います。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char *argv[]) { char s[50]; int n = 0; int count = 0; char *str; if(argc < 2) puts("連結できませんでした"); else{ for(n = 1; n < argc; n++) { str = argv[n]; for(;*str != '\0'; count++) { s[count] = *str; str++; } } } s[count] = '\0'; str = malloc(strlen(s) + 1); if(str != NULL){ strcpy(str, s); printf("%s\n", s); free(str); } } これでは実行できません。どこをどう修正すべきでしょうか? また、まったく違うのであれば正しいのを教えてください。 すいません。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

#2さんに追加補足すると、こんな感じです。 #include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char s[512]; int n; if(argc < 2) printf("連結できませんでした\n"); else { s[0] = '\0'; for(n = 1; n < argc; n++) strcat(s, argv[n]); printf("Result: %s\n", s); } return 0; }

vnn1
質問者

お礼

ありがとうございました。 strcatの使い方に悩んでいたので参考になりました。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

C++でもよいなら... #include <iostream> #include <string> #include <numeric> int main(int argc, char* argv[]) {   std::string str = std::accumulate(&argv[1], &argv[argc], std::string());   std::cout << str << std::endl; } で済んでしまいます。

回答No.2

これでもできるような気がするのですが(詳しく調べていないので断言はできませんが)、どのようなときにどんな結果になってしまうのかその例を示してください。 追記 mallocする理由が良くわからない、sをそのまま利用してはいけないのですか? 問題文に動的に確保したとあるからなのかな? あと、strcatを利用すればもっと簡単になると思うのですが?

vnn1
質問者

補足

たとえば、 %list ABC net work と表示すると、文字列ABCnetwork\0を動的に生成した領域に格納し、ABCnetworkをディスプレイ上に表示する っといった感じです。 mallocをする理由は正直私にもわかりません・・・。 手伝ってもらった部分も多々あるので。 すいません。 確かにstrcatは使えるかもしれません。助言ありがとうございます。 参考にしたいので実際のプログラミングを教えていただけたら幸いです。

回答No.1

#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *s; if(argc != 3) return 1; if(!(s = malloc(strlen(argv[1]) + strlen(argv[2]) + 1))) return 1; sprintf(s, "%s%s", argv[1], argv[2]); puts(argv[1]); puts(argv[2]); puts(s); free(s); return 0; }

関連するQ&A