2015-06-11 71 views
0

我開始學習C將字符串添加到一個二維數組,我已經跑進添加一個字符串輸入到一個二維數組的問題,我能夠正確地獲取字符串輸入,但是當我嘗試並將字符串元素添加到數組中,但它不像預期的那樣工作。當打印數組(這是我如何測試程序)時,它將爲數組中的每個索引分配單個字符而不是整個字符串。如何在C

這裏是我觀看的代碼,非常感謝你事先我很感激張貼任何幫助。

#include <stdio.h> 
main() 
{ 
    char c_array[3][3]; 
    int x; 
    int y; 
    int z=10; 
    int i_user_input; 
    char c_name[256]; 


    for(x=0;x<=+2;x++) 
    { 
     for(y=0;y<=2;y++) 
     { 
      printf("\nPlease enter a name to the system:"); 
      scanf(" %s",&c_array[x][y]); 
      printf("The string is %s\n",c_name); 
      printf("Please press '1' if you would like to keep entering names\n"); 
      printf("Please press '2' if you would like to print the list of names:"); 
      scanf("%d",&i_user_input); 
      if(i_user_input==1) 
       continue; 
      if(i_user_input==2) 
       for(x=0;x<=2;x++) 
       { 
        for(y=0;y<=2;y++) 
        { 
         printf("c_array[%d][%d]=%c\n",x,y,c_array[x][y]); 
        } 
       } 
     } 

    } 

} 

輸出如下所示樣本輸入'佩內洛普!'

c_array[0][0]=P 
c_array[0][1]=e 
c_array[0][2]=n 
c_array[1][0]=e 
c_array[1][1]=l 
c_array[1][2]=o 
c_array[2][0]=p 
c_array[2][1]=e 
c_array[2][2]=! 

回答

0

在你的代碼

scanf(" %s",&c_array[x][y]); 
printf("The string is %s\n",c_name); 

兩個語句是錯誤的。

  1. %s需要一個指向數組的指針而不是一個char。要掃描單個char,您需要%c格式說明符。
  2. c_name,如在printf()使用的未初始化。使用未初始化的值調用undefined behaviour

解決方案:要輸入逐個元素,你可以做這樣做

for(x=0; x<=2 ;x++) 
    { 
     printf("Start entering the name, one character at a time\n"); 
     for(y=0; y< 2; y++)    //note only '<' here 
     { 
      scanf(" %c", &c_array[x][y]); // note the leading space 
     } 
     c_array[x][y] = 0;     //null termination of array to be used as string 
    } 
2

當你聲明: 字符c_array [3] [3];

這意味着你的二維數組中的每個元素是「字符」(單個字符);不是「字符串」。要使每個元素都是一串字符,需要按照以下方式聲明數組: char string_array [3] [3] [256];

我不知道這是你想要做雖然什麼。 Mw感覺是你想要一個3個元素的數組,其中每個元素都是一個字符串。在這種情況下,[3]是不夠的,你的字符串將不得不少於兩個字符(第三個字符保留爲終止零)。

1

如果你想分配一個字符串數組中的每個索引,然後創建數組,如下所示:

#include<stdio.h> 
int main(void) 
{ 
    char a[2][10]; 
    int i=0; 
    char temp[20]; 
    for(i=0;i<2;i++) 
    { 
     scanf("%s",temp); 
     strcpy(a[i],temp); 
    } 
    printf("%s",a[0]); 
    return 0; 
} 

每次您輸入將被存儲在陣列的每個索引串。

+0

你確定'scanf(「%s」,&temp)'? – Pynchia

+0

是的。有用。你對此有什麼困惑? – Ranger

+0

應該不需要'&',對嗎? 'temp'是一個數組(char),即一個指向char的指針。 – Pynchia

1

字符串不是一種類型。他們是一個價值模式一樣,如果你說的int店十的倍數,那麼它在0結束......如果你說的char存儲字符串數組,然後在第一'\0'結束時,看到了嗎?我們可以在不同類型的整數變量中存儲十的倍數,對於字符串也是如此。

字符串是值的模式,而不是類型。當選擇我們想要使用的整數類型時,我們考慮整數的範圍。我們選擇int爲小整數值(小於32768),long爲較大值(小於2147483648)或long long大於此值。因此,我們根據我們預期的十倍數選擇正確類型的整數。同樣對於字符串,我們需要確保我們有足夠的內存來存儲字符串中的字符,最後是'\0'

字符&c_array[x][y]只有足夠的內存0個字符,最後是'\0';它僅用於存儲空字符串。也許你的意思是聲明c_array這樣的:

char c_array[3][3][256]; 

在這種情況下,scanf預計%s對應類型char *的說法...但是你的編譯器可能會警告你,&c_array[x][y]將有類型char (*)[256] 。如果你想解決這個問題的警告,你需要從你的scanf代碼中刪除&

if (scanf("%s", c_array[x][y]) != 1) { 
    /* XXX: Handle an error here,    * 
    * e.g. by exiting or returning or something */ 
} 

雖然我們對這個話題,你會發現,我刪除多餘的空間; %s已經執行了格式指令將執行的功能。我也寫代碼來檢查的scanf返回值,你應該......


還記得我們談到選擇類型,我們用它來存儲數據的整數?另一個考慮因素是我們打算存儲的數據是否可以是負數。考慮一下:在你的代碼中,xy應該能夠存儲負值嗎?負數組索引有什麼意義?建議將所有數組索引聲明爲size_t。當您使用printf打印size_t值時,您需要使用格式說明符%zu而不是%d


char c_name[256]; 
/* ... */ 
printf("The string is %s\n",c_name); 

現在,如果字符串存儲到c_array[x][y],那麼什麼是c_name點?這是一個不必要的變量。改爲使用c_array[x][y]


printf("\nPlease enter a name to the system:"); 

普通的實施方式將常從打印字符避免直到'\n'被寫入;該行是一次打印的,而不是逐個字符。因此,您可能會看到一些奇怪的行爲,例如此行不顯示在正確的時間。通過將'\n'年底的路線,而不是開始解決這個問題:

printf("Please enter a name to the system:\n"); 

...或使用puts,它會自動添加一個「\ n」你:

puts("Please enter a name to the system:"); 

...或使用fflush,這將寫所有未決不成文的數據,即使沒有'\n'

fflush(stdout); 
0
#include <stdio.h> 
#include <string.h> 

int main(void){ 
    char c_array[3][3]; 
    int x; 
    int y; 
    //int z=10;//unused 
    int i_user_input; 
    char c_name[256]; 

    printf("\nPlease enter a name to the system:"); 
    scanf("%255s",c_name); 
    printf("The string is %s\n",c_name); 
    printf("Please press '1' if you would like to keep entering names\n"); 
    printf("Please press '2' if you would like to print the list of names:"); 
    scanf("%d", &i_user_input); 
    if(i_user_input==1) 
     ; 
    else if(i_user_input==2){ 
     memcpy(c_array, c_name, sizeof(c_array)); 
     for(x=0;x<3;x++){ 
      for(y=0;y<3;y++){ 
       printf("c_array[%d][%d]=%c\n", x, y, c_array[x][y]); 
      } 
     } 
    } 
} 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define SIZE 3 

int main(void){ 
    char *c_array[SIZE][SIZE] = { NULL }; 
    int x; 
    int y; 
    //int z=10;//unused 
    int i_user_input; 
    char c_name[256]; 

    for(x=0;x<SIZE;x++){ 
     for(y=0;y<SIZE;y++){ 
      printf("\nPlease enter a name to the system:"); 
      scanf("%255s", c_name); 
      printf("The string is %s\n", c_name); 
      printf("Please press '1' if you would like to keep entering names\n"); 
      printf("Please press '2' if you would like to print the list of names:"); 
      scanf("%d", &i_user_input); 
      c_array[x][y] = strdup(c_name); 
      if(i_user_input==1){ 
       continue; 
      } 
      if(i_user_input==2){ 
       int x, y;//local variable 
       for(x=0;x<SIZE;x++){ 
        for(y=0;y<SIZE;y++){ 
         if(c_array[x][y] != NULL) 
          printf("c_array[%d][%d]=%s\n", x, y, c_array[x][y]); 
        } 
       } 
      } 
     } 
    } 
    for(x=0;x<SIZE;x++) 
     for(y=0;y<SIZE;y++) 
      free(c_array[x][y]); 
} 
0

爲什麼不在你數組/矩陣使用指針?

#include <stdio.h> 
#include <string.h> 

main() 
{ 
char *c_array[3][3]; 
int x; 
int y; 
int z=10; 
int i_user_input; 
char c_name[256]; 

for(x=0;x<=+2;x++) 
{ 
    for(y=0;y<=2;y++) 
    { 
     printf("\nPlease enter a name to the system:"); 
     scanf(" %s",c_name); 
     new_string = malloc(strlen(c_name)+1) 
     if (new_string == NULL) { 
     print("error allocating string\n") 
     exit(-1); 
     } 
     strcpy(new_string, c_name); 
     c_array[x][y] = new_string 

     printf("The string is %s\n",c_name); 
     printf("Please press '1' if you would like to keep entering names\n"); 
     printf("Please press '2' if you would like to print the list of names:"); 
     scanf("%d",&i_user_input); 
     if(i_user_input==1) 
      continue; 
     if(i_user_input==2) 
      for(x=0;x<=2;x++) 
      { 
       for(y=0;y<=2;y++) 
       { 
        printf("c_array[%d][%d]=%c\n",x,y,c_array[x][y]); 
       } 
      } 
    } 
} 
for(x=0;x<=2;x++) { 
for(y=0;y<=2;y++) { 
    free(c_array[x][y]) 
} 
} 
} 

上面的代碼將輸入字符串存儲在數組的每個單元格中,如果這是您的目標。

注:我沒有嘗試過,所以可能會有微妙的錯誤。我的觀點是向你展示如何使用指針及其與數組的等價性。沒有指針使用C是毫無意義的。 :)