【问题标题】:Need help debugging a C concatenation program需要帮助调试 C 连接程序
【发布时间】:2021-05-30 00:14:32
【问题描述】:

我正在尝试为这个程序调试一些代码。它应该读取两个字符串并将它们连接成一个新字符串。我有三个组成程序的文件:

ma​​in.c:

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

int main(void){
  char mainStr[MAXSTR]="Initial string";
  safeReadString(mainStr,MAXSTR);
  int remChars=MAXSTR-strlen(mainStr)-1;
  int i;
  printf("Got here");
  if (remChars>0)
  {
    char * insStr;
    safeReadString(insStr,remChars);
    char newStr[strlen(mainStr)+strlen(insStr)+1];
    for(i=0;i<=strlen(mainStr);i++)
      newStr[i]=mainStr[i];
    for(int j=0;j<=strlen(insStr);j++)
      newStr[i+j]=insStr[j];
    printf("The result of concatenating:\n%s\nwith:\%s\nis:\n%s\n",mainStr,insStr,newStr);
  }
  else
    printf("No room for inserting a string\n");

}

safeStr.c:

#include "safeStr.h"

void safeReadString(char *str,int size)
{
  char c;
  char* s=str;
  int count=0;
  printf("Please type a string of at most %d characters.\n",size);

  c=getchar();
  while((c!='\0') || (count<size))
  {
    s+=c;
     s++;
     count++;
     c=getchar();
     printf("*s: %d s: %s count: %d\n", *s, s, count);
  }
  *s='\0';
}

和 safeStr.h:

#include<string.h>
#include<stdio.h>
#define MAXSTR 80

void safeReadString(char *str,int size);

我很确定大部分问题都出在函数中,因为我尝试输入一个字符串,但我什么也没得到。

【问题讨论】:

  • s+=c; 不会向字符串写入任何内容。应该是*s=c
  • char * insStr; safeReadString(insStr,remChars); 这是未定义的行为,因为insStr 是一个未初始化的指针,safeReadString 取消了它的引用。将insStr定义为数组或使用malloc动态分配内存。

标签: c debugging


【解决方案1】:

我修复了以下代码中的一些错误。

#include<string.h>
#include<stdio.h>
#define MAXSTR 80

void safeReadString(char *str,int size)
{
        char c;
        char* s=str;
        int count=0;

        rewind(stdin);
        printf("Please type a string of at most %d characters.\n",size);

        c=getchar();
        //while((c!='\0') || (count<size))
        while((c!=EOF) && (count<size))
        {
                //s+=c;
                *s = c;
                s++;
                count++;
                c=getchar();
                printf("*s: %d s: %s count: %d\n", *s, s, count);
        }
        *s='\0';
}

int main(void){
        char mainStr[MAXSTR]="Initial string";
        safeReadString(mainStr,MAXSTR);
        int remChars=MAXSTR-strlen(mainStr)-1;
        int i;
        printf("Got here");
        if (remChars>0)
        {
                //char * insStr;
                char insStr[MAXSTR];
                safeReadString(insStr,remChars);
                char newStr[strlen(mainStr)+strlen(insStr)+1];
                //for(i=0;i<=strlen(mainStr);i++)
                for(i=0;i<strlen(mainStr);i++)
                        newStr[i]=mainStr[i];
                for(int j=0;j<=strlen(insStr);j++) 
                        newStr[i+j]=insStr[j];
                printf("The result of concatenating:\n%s\nwith:\%s\nis:\n%s\n",mainStr,insStr,newStr);
        }
        else
                printf("No room for inserting a string\n");

}

输入字符串时。你应该输入字符串,按回车,按Ctrl+D。 并且在这个函数之外的每个字符串中都会留下'\n'。

不要使用 getchar(),试试 fgets() ~

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多