1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5838

文字列の処理
投稿者---涼(2006/06/18 16:22:05)


OS WINDOWSXP
コンパイラ Cygwin(gcc)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <unistd.h>

char *command[100];

void shingou(int sig) {
printf("Ctrl-Cが入力されました");
exit(0);
}

int main() {
int i = 0;
int a = 0;
int in[100];
int stat_val;
char *com[100];
char *com2[100];
char *string = ".exe";
char seps[] = "|";
char seps2[] = " ";
pid_t pid;

putenv("PWD=/bin");

while(1) {
(void)signal(SIGINT, shingou);
printf("<myprompt> ");
*command = "null";
scanf("%[^\n]", command);
com[0] = strtok( command, seps );
while(com[i] != NULL) {
com[i+1] = strtok( NULL, seps );
i++;
}
i = 0;
com2[0] = strtok( com[0], seps2 );
while(com2[i] != NULL) {
com2[i+1] = strtok( NULL, seps2 );
i++;
}
if(strcmp ( command, "exit") == 0) {
printf("終了します\n");
exit(1);
}
pid = fork();
switch(pid) {
case -1:
printf("error\n");
exit(1);
case 0:
strcat(com2[0], string);
printf("%s\n", com2[0]);
printf("%s\n", com2[1]);
if(strcmp ( com2[0], "5") == 0 || strcmp ( com2[0], "7") == 0) {
} else {
in[0] = open(com2[0], O_RDONLY);
if(in[0] != -1){
execlp(com2[0], com2[0], com2[1], 0);
} else {
printf("Command not find\n");
}
}
default:
wait(&stat_val);
}
getchar();
}
}

このようなプログラムを組んだのですが、switch文のcase 0内で「strcat(com2[0], string);」として、文字列com2[0]の後ろに.exeと文字がつくようにしました。次のprintfで確認するとcom2[0]は希望通りに行くのですがcom2[1]の文字列がexeに変わってしまいました。com2[1]の文字列がexeに変わるのを避けるにはどうすればいいのでしょうか。教えてください。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:文字列の処理 5839 επιστημη 2006/06/18 16:30:05


No.5839

Re:文字列の処理
投稿者---επιστημη(2006/06/18 16:30:05)


>このようなプログラムを組んだのですが、switch文のcase 0内で「strcat(com2[0], string);」として、文字列com2[0]の後ろに.exeと文字がつくようにしました。次のprintfで確認するとcom2[0]は希望通りに行くのですがcom2[1]の文字列がexeに変わってしまいました。com2[1]の文字列がexeに変わるのを避けるにはどうすればいいのでしょうか。教えてください。

なぜそうなるか、わかりますか?



この投稿にコメントする

削除パスワード

No.5840

Re:文字列の処理
投稿者---涼(2006/06/18 17:08:22)


すいません。わかりません。


この投稿にコメントする

削除パスワード

No.5841

Re:文字列の処理
投稿者---επιστημη(2006/06/18 17:33:21)


>すいません。わかりません。


strcatは文字列の領域を拡げてくれるわけではありません。
単に文字列から'\0'を見つけ、そこ以降に文字列を上書きするだけ。
だから後続する領域はstrcatによって書き潰されます。




この投稿にコメントする

削除パスワード

No.5842

Re:文字列の処理
投稿者---涼(2006/06/18 17:53:16)


stratではだめだったのですか・・・。
では、com2[1]の文字列がexeに変わるのを避けるにはどうすればいいのでしょうか?


この投稿にコメントする

削除パスワード

No.5843

Re:文字列の処理
投稿者---επιστημη(2006/06/18 21:06:29)


>では、com2[1]の文字列がexeに変わるのを避けるにはどうすればいいのでしょうか?

malloc/free で新たな領域を確保するのが妥当かと。



この投稿にコメントする

削除パスワード

No.5844

Re:文字列の処理
投稿者---涼(2006/06/18 21:46:19)


すいません。
私の作ったプログラム中のどこでどうmallocを使ったらいいのかわかりません。
たびたび申しわけありませんが教えてくださいませんか。


この投稿にコメントする

削除パスワード

No.5845

Re:文字列の処理
投稿者---επιστημη(2006/06/18 22:22:34)


>すいません。
>私の作ったプログラム中のどこでどうmallocを使ったらいいのかわかりません。
>たびたび申しわけありませんが教えてくださいませんか。

説明もないコメントさえないインデントすらできていないコードの
どこをどういじれと仰いますか!?



この投稿にコメントする

削除パスワード

No.5846

Re:文字列の処理
投稿者---涼(2006/06/18 22:55:45)


すいません。自分でがんばってみます。





この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ