gpt4 book ai didi

c - 在 C 中解析字符串,不使用 Strtok()

转载 作者:行者123 更新时间:2023-11-30 16:21:53 24 4
gpt4 key购买 nike

我需要通过删除其中的所有非字母字符来解析 C 中的字符串。为此,我检查每个字符的 ascii 值并确保其在正确的范围内。它按照我想要的方式工作,所以这不是问题。然而,我遇到的问题是在解析完成后存储结果字符串。 (顺便说一句,我已经学习 C 语言 3 周了)此外,如果您注意到我对数组使用了奇怪的大小,那是因为我故意使它们比需要的更大。

char * carry[2]; // This is to simulate argv
carry[1] = "hello1whats2up1"; // 0 is title so I placed at 1

char array[strlen(carry[1])]; // char array of string length
strcpy(array, carry[1]); // copied string to char array

char temp[strlen(carry[1]) + 1]; // Reusable char array
char * finalAnswer[10];

int m = 0, x = 0; // Indexes

if ((sizeof(carry))/8 > 1) { // We were given arguments

printf("Array: %lu\n\n", sizeof(array));
for (int i = 0; i < sizeof(array); i++)
{
if(isalpha(array[i])) { // A-Z & a-z
//printf("%s\n", temp);
temp[x] = array[i]; // Placing chars in temp array
x++;

}
else {
printf("String Length: %lu \nString Name: %s \nWord Index: %d \n\n",
strlen(temp), temp, m); // Testing Purposes
strcpy(finalAnswer[m], temp); // Copies temp into the final answer *** Source of Error

for(int w = 0; w < sizeof(temp); w++) { temp[w] = '\0'; } // Clears temp

x = 0;
m++;
}
}
printf("String Length: %lu \nString Name: %s \nWord Index: %d \n",
strlen(temp), temp, m); // Testing Purposes
strcpy(finalAnswer[m], temp);

for(int w = 0; w < sizeof(temp); w++) { temp[w] = '\0'; } // Clears temp

x = 0;
}

else { printf("No Arguments Given\n"); }

printf("\n");

** 编辑

当我尝试将 temp 复制到 FinalAnswer 时,我不断收到错误

** 编辑 2

我解决了 char * FinalAnswer[10] 遇到的问题

当我尝试在 FinalAnswer 上使用 strcpy 时,我从未指定存储特定字符串所需的大小。我这样做后效果很好。

最佳答案

既然你已经解决了实际的字符串解析问题,我就以你最后的评论作为实际的需求。

“...我想创建一个可以通过索引访问的不同长度的单词列表...”

如果一个人“学习 C 语言三周”,这当然不是一项容易解决的任务。表示 main() 第二个参数的数据结构是:

        // array (of unknown size)
// of pointers to char
char * argv[] ;

这可以写成指向指针的指针:

        // same data structure as char * []
char ** list_of_words ;

这将把你直接推向 C 的深渊。一个不平凡的 C 数据结构。因此,可能需要四个星期多一点的 C 时间。

但我们可以发挥创造力。我们可能会使用“C 中内置的”一种重要的数据结构。一份文件。

我们可以将单词写入文件中。一字一行。这就是我们的输出:单词列表,以换行符分隔,存储在文件中。

我们甚至可以想象并编写一个函数,“按索引”从结果中读取单词。正如您(似乎)需要的那样。

         // hint: there is a FILE * behind
int words_count = result_size () ;
const char * word = result_get_word(3) ;

现在,除了最后一个“关键”部分之外,我已经大胆地写下了“全部”内容。毕竟,我确信您也愿意做出贡献。

因此,工作代码(减去 result_size)和 result_get_word() )在这里仍然有效:https://wandbox.org/permlink/uLpAplNl6A3fgVGw

为了避免“可汗之怒”,我也将其粘贴在这里:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*
task: remove all non alpha chars from a given string, store the result
*/

int process_and_save (FILE *, const char *) ;
int dump_result(FILE *) ;

int main( const int argc, const char * argv[] )
{
const char * filename = "words.txt";
const char * to_parse = "0abra123ka456dabra789" ;

(void)(&argc) ; (void)argv ; // pacify the compiler warnings

printf("\nInput: %s", to_parse ) ;
int retval = process_and_save(fopen(filename, "w"), to_parse ) ;
if ( EXIT_FAILURE != retval )
{
printf("\n\nOutput:\n") ;
retval = dump_result(fopen(filename, "r"));
}
return retval ;
}

int process_and_save (FILE * fp, const char * input )
{
if(!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
//
char * walker = (char *)(input) ;
while ( walker++ )
{
if ( ! *walker ) break ;
if ( isalpha(*walker) ) {
fprintf( fp, "%c", *walker ) ;
// I am alpha but next one is not
// so write word end, next
if ( ! isalpha(*(walker +1) ) )
fprintf( fp, "\n" ) ;
}
}
fclose(fp);
return EXIT_SUCCESS;
}

int dump_result(FILE* fp )
{
if(!fp) {
perror("\nFile opening failed");
return EXIT_FAILURE;
}

int c; while ((c = fgetc(fp)) != EOF) { putchar(c); }

if (ferror(fp))
puts("\nI/O error when reading");

fclose(fp);
return EXIT_SUCCESS;
}

我认为这是功能性的,可以完成解析和存储结果的工作。不是在复杂的数据结构中,而是在简单的文件中。其余的应该很容易。如果需要帮助请告诉我。

关于c - 在 C 中解析字符串,不使用 Strtok(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54679503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com