簡體   English   中英

如何將char *轉換為2d char數組

[英]How to transfer a char * into a 2d char array

我試圖采用一個char * ,它代表一個單詞,我從一個函數中獲得了char * ,並將其放入2d數組中,但是它只是將每個單詞的第一個字母重復幾次。 輸出看起來像這樣

ttttttttttttttttttttttttttttttttvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvoooooooooooooooooooooooooo

而我的輸入文件是

three
versions
of
simple
with
spell
check
checking
program
we
will
write

我不確定如何正確將char *轉換為2d數組,這是我正在使用的所有功能

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include "dict.h"



bool is_valid_entry( int strLength, char entry[] ){

    if( entry[0] != '"' && !isalpha(entry[0]) && entry[0] != '\''  ){
        return false;
    }

    strLength--; /* to allow for the zero index of the array*/

    for ( int i=1; i < strLength; i++ )
        if ( !isalpha( entry[i] ) ){

            return false;
        }

    if (!isalpha( entry[strLength] ) && !ispunct( entry[strLength] ) && entry[strLength] != '"' && entry[strLength] != '\'' ){

        return false;
    }
return true;/* if the entry passes all of the tests the function will return true meaning the the word is valid*/ 

}/* ends is_valid_entry( int strlength, char entry[] )*/



char * normalize( int strLength, char entry[], char output[] ){

    strLength--;/* to allow for the zero index of an array*/
    int j = 0;

    for( int i = 0;i < strLength; i++){/* converts all of the elements in the entry[] to lower case*/
        if (isupper( entry[i] ) ){
            entry[i] = tolower( entry[i] );
        }
    }

    if( ( entry[0] == '"' && entry[strLength] == '"' ) || (entry[0] == '\'' && entry[strLength] == '\'' ) ) {
        for(int i=1 ; i < strLength ; i++,j++ ){ 
            output[j] = entry[i];
        }
        output[j] = '\0';/* removes the last character which is either a '"' ir a '\''*/
        return output;/* returns the noramlized word*/

        }else if( entry[0] == '"' || entry[0] == '\'' ){
            for(int i = 1; j < strLength; i++, j++ ){/*i=1 in order to skip the first element in the entry arrary*/
                output[j] = entry[i];
            }
            output[j] = '\0';
            return output;/* returns the noramlized word*/

        } else if( entry[strLength] == '"' || ispunct( entry[strLength] ) || entry[strLength] == '\''){
                for(int i = 0;j < strLength; i++,j++ ){
                    output[j] = entry[i];
                }
                output[j] = '\0';
                return output;/* returns the noramlized word*/
            }


return entry;/* returns the original array since it does not need to be normalized*/

}/* ends normalize( int strlength, char entry[], char output[] )*/
    void load_dict(char *fileName, char dictionary[30000][31]) {

    FILE *fdict;
    fdict = fopen( fileName, "r" );/* file pointer for the dictionary file*/
    char *normDictWord;
    char normDict [33]; 

    int strLength,i,j,ch;    
    if ( fdict == NULL ){
        fprintf(stderr,"Could not open file: %s\n", fileName );/*checks to make sure the dictionary file can be opened*/
        exit(1);
    }

    for (i = 0; (ch = fgetc( fdict ) ) != EOF; i++ ) {          

        char word[33] = "";/* resets the array*/


        for (strLength = 0; !isspace( ch ) ; strLength++ ){
            word[strLength] = ch;
            ch = fgetc( fdict );            
                }

        if (is_valid_entry( strLength , word ) ){
            normDictWord = normalize( strLength , word , normDict );/*normalize then do the linear search then print the word if it is not found in the dictionary*/

            for(j = 0; j <= 31;j++){
                dictionary[i][j] = * normDictWord ;
                printf("%c",dictionary[i][j]);
            }

        }


    }
    fclose( fdict ); 
}

我無法完全理解您的代碼,修復格式並添加缺少的部分(否則我無法對其進行測試)。 然而:

dictionary[i][j] = * normDictWord;

應該是這樣的:

dictionary[i][j] = * (normDictWord + j);

或等效地:

dictionary[i][j] = normDictWord[j] ;

關鍵問題(@pez)

  for (j = 0; j <= 31; j++) {
    // dictionary[i][j] = *normDictWord;
    dictionary[i][j] = normDictWord[j];
    printf("%c", dictionary[i][j]);
  }

其他一些問題:

如果在空格之前出現EOF條件,原始代碼將無限循環。 isspace(EOF)為假。 此循環也不能防止超限。

char word[33] = "";

// for (strLength = 0; !isspace(ch); strLength++) {
for (strLength = 0; !isspace(ch) && ch != EOF && strLength < sizeof word; strLength++) {
  word[strLength] = ch;
  ch = fgetc(fdict);
}

以下內容並不“將entry []中的所有元素都轉換為小寫”,而僅是元素[0 ]... [original_string_length-2] 也許代碼應該做strLength--; 循環。

strLength--;/* to allow for the zero index of an array*/
...
for (int i = 0; i < strLength; i++) {/* */
  ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM