C 在分隔符处拆分一行文本后打印

C 在分隔符处拆分一行文本后打印,c,pointers,scanf,C,Pointers,Scanf,我打印这个有困难。当我要求用户插入一个int时,它起作用了,但当我试图将它切换到char输入时,它变得扭曲,无法打印任何内容 #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { const char delim[2] = ","; char *token; int j = 0; char *hh; FILE *ptr_file;

我打印这个有困难。当我要求用户插入一个
int
时,它起作用了,但当我试图将它切换到
char
输入时,它变得扭曲,无法打印任何内容

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

int main() {
    const char delim[2] = ",";
    char *token;
    int j = 0;
    char *hh;
    FILE *ptr_file;
    char buf[1000];

    ptr_file = fopen("input.txt", "r");
    if (!ptr_file)
        return 1;

    char *pt[] = { "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na" };

    printf("what element do you want(Use atomic number)");
    scanf("%s", &hh);

    for (j = 0; j <= 3; j++) {
        if (hh == pt[j]) {
            fgets(buf, 1000, ptr_file);
            token = strtok(buf, delim);
            while (token != NULL) {
                printf("%s\n", token);
                token = strtok(NULL, delim);
            }
            break;
        } else {
            fgets(buf, 1000, ptr_file);
            continue;
        }
    }

    fclose(ptr_file);
    return 0;
}
#包括
#包括
#包括
int main(){
const char delim[2]=“,”;
字符*令牌;
int j=0;
char*hh;
文件*ptr_文件;
char-buf[1000];
ptr_file=fopen(“input.txt”,“r”);
如果(!ptr_文件)
返回1;
char*pt[]={“H”、“He”、“Li”、“Be”、“B”、“C”、“N”、“O”、“F”、“Ne”、“Na”};
printf(“您想要什么元素(使用原子序数)”);
扫描频率(“%s”和&hh);

对于(j=0;j这里的主要问题是,您正在传递未初始化指针的地址
scanf()
hh
scanf
调用未定义的行为,试图将单词存储在该地址

您应该使
hh
成为一个数组,如
char hh[8]={0};
并以这种方式使用
scanf()

 scanf("%7s", hh);  // to avoid buffer overflow
也就是说

  • if(hh==pt[j])
    不是比较字符串的方法。您需要使用,然后编写
    if(strcmp(hh,pt[j])==0)
  • 您还应该检查
    scanf()
    的返回值,以验证输入是否正确转换
    • 代码

      char  *hh;
      //...
      scanf("%s", &hh);
      
      这是由于
      hh
      未初始化:它指向垃圾。 此外,
      “%s”
      格式说明符希望
      char*
      作为传递参数:您正在传递
      char**

      应该是

      char  *hh = malloc(MAX_STRING_LEN);
      if (hh != NULL)
      {
         //...
         scanf("%s", hh);
      }
      free(hh);
      
      或者干脆

      char  hh[MAX_STRING_LEN] = {0};
      //...
      scanf("%s", hh);
      
      在这两个示例中,
      MAX\u STRING\u LEN
      表示空终止符的字符串+1的最大可接受长度


      使用无法使用逻辑运算符比较字符串,因此代码

      if(hh == pt[j])
      
      正在比较地址而不是字符串。
      您可以使用来执行此操作。

      那么我该如何执行此操作呢?我尝试了,但被给出了一个错误。错误:“MAX_STRING_LEN”未声明(首次在此函数中使用)char hh[MAX_STRING_LEN]={0}“@christian MAX_STRING_LEN”只是一个指示器,指示您应该输入所需的最大字符串长度。如果
      scanf
      具有类似
      printf
      的语义,那就太好了……不幸的是,
      scanf(“%*s”,MAX_STRING_LEN-1,hh);
      将只解析一个单词并将其丢弃。
      *
      表示不存储。指定要存储的最大字符数的唯一方法是在格式字符串中使用显式数字。您仍然应该通过硬编码一些大小来保护目标。这很难看,但很安全。@chqrlie我会使用fgets;)