2016-10-29 35 views
1

問題我有C.一個奇怪的問題,strca噸這是代碼:與strcat的

char *getip(char n[]) 
{ 
    char *x[255]; 
    strcat(x, n); 
    char *ip; 
    ip = strtok(x, "/"); 
    return ip; 
} 

char *adrr(char n[]) 
{ 
    char *ip[255]; 
    strcat(ip, getip(n)); 
    return ip; 
} 

int main(void) 
{ 
    scanf("%s", &n); 
    printf("IP : %s\n", getip(n)); 
    printf("IP : %s", adrr(n)); 
} 

第一printf回報正是我想要回來,雖然功能adrr看似什麼都不做,第二個printf在開始和結束返回一些隨機字符。

+2

'字符* IP [255]'應'char ip [255]'否則它是一個指針數組。那麼,不是一個字符串。而且這不起作用,因爲你要返回一個臨時引用 –

+1

首先,把'char * x [255]'改成'char x [255]'。 –

+1

..並初始化它,以便'strcat'可以使用'char x [255] = {0};' –

回答

3

有在你的代碼中的許多問題:

  • getip定義xchar *x[255],它應該是char x[255]
  • 你應該調用strcat之前初始化x或使用strcpy
  • ip指向本地數組x,將其返回給調用者調用未定義的行爲,因爲它指向的數組在該函數返回後無法使用。
  • adrr()
  • n同樣的問題在main沒有被定義爲scanf("%s",&n);

第一個功能似乎有望走出純粹是運氣的工作,在不同的系統上編譯時,它可能會失敗,甚至只是在不同的一天;-)

這裏是一個解決方案:

#include <stdio.h> 

char *getip(char *dest, const char *src) { 
    for (i = 0; src[i] != '\0' && src[i] != '/'; i++) { 
     dest[i] = src[i]; 
    } 
    dest[i] = '\0'; 
    return dest; 
} 

int main(void) { 
    char n[256]; 
    char ip[256]; 

    if (scanf("%255s", n) == 1) { 
     printf("IP: %s\n", getip(ip, n)); 
    } 
    return 0; 
} 
+0

n被宣佈爲全局。當我將x定義爲「char x [255] =」「;」時,getip函數將不再起作用 – Andrei

+0

@Andrei:子彈#3特指此問題。爲了解決這個問題,你需要將'x'聲明爲'static'(這意味着如果你從不同的線程調用這個函數,你可能會碰到併發問題),或者動態分配這個內存塊(這意味着你會必須在執行程序的稍後時間釋放它)。 –

+0

感謝你們,我只是把它變成了靜態字符x [255] = {0}; ,使用strcpy,現在它似乎工作。 – Andrei

0
  1. 在主n不存在
  2. 我想你想的char BUF [10],但寫的char * BUF [10]
  3. 如果返回一個指針,只有在函數內部存在記憶比結果是未定義的。使其靜態或動態。
+0

「使其成爲靜態或動態」應該是「**聲明* *它靜態或**動態分配**「。 –